1.对称加密的缺陷
对称加密算法的加密和解密都是用同一个密钥。
首先当通信双方各自持有同一个秘钥且没有人知道也没有被破解,则通信双方的安全通信是可以保证的。但是在服务器端向客户端发送密钥的时候,中途可能被别人劫持,导致泄密。
如果浏览器内部预存了网站A的密钥,且可以确保除了浏览器和网站A,不会有任何外人知道该密钥,那理论上用对称加密是可以的。那么若浏览器只要预存了世界上所有https网址的密钥就可以了,但是这样是不现实的。
因此就需要使用非对称加密来解决这个问题。
2.非对称加密
非对称加密算法需要一组密钥对,分别是公钥和私钥,这两个密钥是成对出现的。公钥加密的内容需要对应的私钥解密,私钥加密的内容需要对应的公钥解密。私钥由服务器自己保存,公钥发送给客户端。客户端拿到公钥后可以对请求进行加密后发送给服务端,这时候就算中间被截获,没有私钥也无法解密发送的内容,这样确保了客户端发送到服务端数据的安全。
但是,若通信双方采用两组非对称密钥,是非常消耗性能及时间的,因此可以采用非对称加密+对称加密的方式实现安全通信。
3.非对称加密 + 对称加密(非对称加密、解密各只需一次的方法)
- 某网站拥有用于非对称加密的公钥A1、私钥A2。
- 浏览器向网站服务器请求,服务器把公钥A1明文给传输浏览器。
- 浏览器随机生成一个用于对称加密的密钥X,用公钥A1加密后传给服务器。
- 服务器拿到后用私钥A2解密得到密钥X。
这样双方就都拥有密钥X了,且别人无法知道它。之后双方所有数据都用密钥X加密解密即可。但是还是有漏洞,中间人可以替换公钥进行数据截获替换。
4.中间人攻击
- 某网站拥有用于非对称加密的公钥A1、私钥A2。
- 浏览器向网站服务器请求,服务器把公钥A1明文传输给浏览器。
- 中间人劫持到公钥A1,保存下来,把数据包中的公钥A1替换成自己伪造的公钥B1(它当然也拥有公钥B1对应的私钥B2)。
- 浏览器随机生成一个用于对称加密的密钥X,用公钥B1(浏览器不知道公钥被替换了)加密后传给服务器。
- 中间人劫持后用私钥B2解密得到密钥X,再用公钥A1加密后传给服务器。
- 服务器拿到后用私钥A2解密得到密钥X。
这样在双方都不会发现异常的情况下,中间人得到了对称密钥X。根本原因是浏览器无法确认自己收到的公钥是不是网站自己的。
5.数字证书
那么如何证明浏览器收到的公钥一定就是该网站的公钥呢?
这里就需要像人的身份证(权威机构颁发)一样能证明此人的信息。
所以网站在使用HTTPS前,需要向“CA机构”申请颁发一数字证书,数字证书里有证书持有者、证书持有者的公钥等信息。服务器把证书传输给浏览器,浏览器从证书里取公钥就可以了。
然而由于目前“社会”造假严重,证书本身的传输过程中,如何防止被篡改?即如何证明证书本身的真实性?数字证书怎么防伪呢?
这个时候就需要拿此证的人进行签名,签名是具有法律效益的,可不能随便乱签哟!
6.数字签名
因此可以把证书内容生成一份“签名”,比对证书内容和签名是否一致就能察觉是否被篡改。这种技术就叫数字签名。
下图中左侧是数字签名的制作过程,右侧是浏览器验证过程。
数字签名的制作过程:
- CA拥有非对称加密的私钥和公钥。
- CA对证书明文信息进行hash。
- 对hash后的值用私钥加密,得到数字签名。
明文和数字签名共同组成了数字证书。
浏览器验证过程:
- 拿到证书,得到明文T1,数字签名S1。
- 用CA机构的公钥对S1解密(由于是浏览器信任的机构,所以浏览器保有它的公钥),得到S2。
- 用证书里说明的hash算法对明文T1进行hash得到T2。
- 比较S2是否等于T2,等于则表明证书可信。