HTTPSHTTP缺点:通信采用明文(未加密),内容可能被窃听;通信方身份未验证,可能会遇到伪装;消息的完整性无法证明,因此可能被篡改;为了统一这些问题,需要在HTTP中加入加密、认证等机制。即在HTTP中加入了加密和认证机制,称为HTTPS(HTTPSecure)。HTTPSHTTPS并不是应用层的新协议,只是HTTP通信接口部分被SSL或TLS协议取代。通过采用SSL,HTTP具有加密、证书和完整性保护等功能。通常,HTTP直接与TCP通信。在使用SSL时,演变为先用SSL通信,再用SSL和TCP通信。SSL:SecureSocketLayer,安全套接字层,主要任务是提供保密性、信息完整性和身份认证。SSL独立于HTTP协议,介于TCP/IP协议和各种应用层协议之间。其它运行在应用层的协议,如SMTP、Telnet等,都可以与SSL协议结合使用。SSL是当今世界上使用最广泛的网络安全技术。详情请参考SSL/TLS协议详解。TLS:TransportLayerSecurity,安全层传输协议HTTPS:HTTPSecure,超文本传输??安全协议HTTPS混合加密机制HTTPS采用了混合加密机制,既使用对称加密又使用非对称加密,充分利用两者各自的优点。对称加密加密和解密使用同一个密钥的方法称为对称加密。在对称加密中,密钥也必须发送给对方。为什么不直接使用对称加密呢?如果通信双方都持有相同的密钥,并且密钥没有泄露出去,那么双方之间的通信就是安全的。然而,问题是如何让传输双方安全地知道密钥呢?.如果服务器生成一个密钥并传输给浏览器,此时通信被监听,则密钥可能落入攻击者手中,加密的意义也就失去了。如果网站A的密钥预先存储在浏览器中,并且可以保证除了浏览器和网站A之外没有人知道密钥,那么理论上可以使用对称加密。只要浏览器预存了全球所有HTTPS网站的key!这样做显然是不现实的。非对称加密非对称加密很好地解决了对称加密的缺点。使用不同密钥的加密和解密称为非对称加密。所以非对称加密有两把钥匙,一把是私钥(privatekey),一把是公钥(publickey)。用私钥加密的信息只能用公钥解密,用公钥加密的信息只能用私钥解密。为什么会这样?因为RSA算法。RSA算法RSA算法计算过程如下:随机选择两个素数p和q计算n=pq计算φ(n)=(p-1)(q-1)找一个相对较小的奇数e与φ(n)互质,互质是指两个数的公约数只有一对模数φ(n)。计算e的乘法逆元d,即求一个d,使下式成立:(e*d)modφ(n)=1得到公钥:(e,n),私钥:(d,n)加密过程:c=(m^e)modn,(c为加密后的密文,m为原文)解密过程:m=(c^d)modn为什么加密后的数据不能公钥本身被解密?因为加密算法(m^e)modn是模运算,所以模运算不能逆向。例如,5对4取模,5%4=1,但反过来,已知x%4=1,求x。这个x可以有无穷多个,5,9,13...所以即使有公钥(e,n)和密文c,也不知道(m^e)取哪个值。这就是非对称加密保密的核心。私钥加密也是如此,无法自行破译。为什么不直接使用非对称加密呢?因为非对称加密非常耗时且效率低下,而对称加密要快得多,所以应该尽可能减少非对称加密的次数。混合加密机制的请求过程A网站有公钥A和私钥A'进行非对称加密。浏览器向网站服务器请求,服务器将公钥A明文发送给浏览器。浏览器随机生成一个密钥X进行对称加密,用公钥A加密后发送给服务器。服务端拿到后用私钥A'解密得到密钥X,双方都有密钥X,然后双方的所有数据都可以通过密钥X加密解密。为什么公钥明文传输?如果将公钥加密传输,就成了先有鸡还是先有蛋的问题……这时候,一切看起来都很完美,但是如何证明浏览器收到的公钥一定是网站的公钥呢?钥匙在哪里?如果请求被攻击:某网站有公钥A和私钥A'进行非对称加密。浏览器向网站服务器发起请求,服务器将公钥A明文发送给浏览器。攻击者劫持公钥A并保存,并用伪造的公钥B替换数据包中的公钥A(攻击者拥有公钥B对应的私钥B’)。浏览器生成一个对称加密的密钥X,用公钥B加密(浏览器无法知道公钥被替换),发送给服务器。劫持后,攻击者用私钥B'解密密钥X,再用公钥A加密后发送给服务器。服务端拿到后用私钥A'解密得到密钥X,此时双方都不会察觉到异常。出现这种情况的根本原因是浏览器无法确认收到的公钥是否正确。数字证书综上所述,浏览器无法证明收到的公钥就是网站的公钥。为了解决这个问题,出现了数字证书。数字证书由数字证书认证机构(CA,CertificateAuthority)颁发给服务器。(CA组织是客户端和服务端都信任的第三方权威组织。)CA组织通过服务端提供的相关信息生成证书。数字证书通常包括:公钥;持有人信息;证书认证机构(CA)信息;CA在本文档上的数字签名和使用的算法;证书的有效期;其他附加信息...您可以在浏览器控制台中查看数字证书。百度数字证书如下:如何防止证书被篡改?为了避免篡改证书的内容,出现了数字签名CertificateSignature。CA组织将网站的公钥、用途、颁发者、有效时间等基本信息打包,然后对这些信息进行Hash计算,得到一个Hash值;然后CA组织使用自己的私钥加密Hash值生成数字签名,即CA对证书进行签名。业务流程服务器向CA组织提交数字证书申请。CA组织识别申请者身份后,生成包含公钥、用途、颁发者、有效时间、数字签名、哈希算法等信息的数字证书,发送给Server。服务器将这个数字证书发送给客户端,接收证书的客户端使用CA组织的公钥对数字证书进行验证。客户端使用相同的Hash算法得到证书的Hash值H1;使用CA的公钥对数字签名进行解密,得到Hash值H2;比较H1和H2,如果值相同,则为可信证书;否则,该证书被认为是不可靠的信件。如果证书校验通过,客户端可以确认两件事:认证服务器的公钥是真实有效的数字证书认证机构。数字证书的公钥是可信的。证书校验通过后,客户端生成对称加密的密钥X,用公钥加密后发送给服务器。服务端拿到后用私钥A解密得到密钥X,后面的通信都是用密钥X加密解密的。为什么做数字签名的时候需要hash呢?因为经过哈希算法后,得到的是固定长度的哈希码(比如用md5算法哈希后可以得到固定的128位值)。收件人用私钥解密得到哈希码,再用哈希算法对消息内容进行哈希运算得到新的哈希码。它只需要将解密后的散列码与从散列内容中得到的两个定长散列码进行比较即可。;这样做直接加密和解密消息内容比不散列更好。如何证明CA组织的公钥是可信的?CA的公钥必须安全地传输给客户端。当使用通信方式时,安全地传输它们是非常困难的。因此,大多数浏览器都会预先嵌入常用证书颁发机构的公钥。这是为了确保CA组织的公钥是可信的。(先有鸡还是先有蛋的问题。。。)证书链敬请期待~~
