[转] HTTPS 加密原理简介
原文链接:http://www.cnblogs.com/JeffreySun/archive/2010/06/24/1627247.html
0x00 对称加密与非对称加密
- 对称加密算法的加密和解密秘钥一样,不区分公钥和私钥,秘钥对外保密.
- 非对称加密算法的加密秘钥和解密秘钥不一样,公钥加密的内容只能由私钥解密,私钥加密的内容只能由公钥解密,其中私钥保密,公钥公开.
0x01 加密通信基本流程
-
Step1:
客户端–>服务器:你好 -
Step2:
服务器–>客户端:你好,我是服务器 -
Step3:
客户端–>服务器:向我证明你是服务器 -
Step4:
服务器–>客户端:- 服务器生成随机字符串string
- 服务器用自己的私钥加密string,生成密文str
- 服务器把string和str发送给客户端
-
Step5:
客户端–>服务器:- 客户端收到服务器的数据后,用服务器的公钥解密str,生成string1
- 客户端将string1和string对比,若一致则说明对方确实是服务器(因为私钥加密后的内容只能由公钥解密,私钥只有服务器持有)
- 客户端选择一个对称加密算法和一个秘钥,用服务器公钥将他们加密发送给服务器,告诉服务器后续的通信用这个秘钥加密,因为公钥加密的数据只有私钥能解密,所以对称加密的算法和秘钥只有服务器知道
-
Step6:
服务器–>客户端: 服务器用私钥解密收到的数据得到对称加密算法及其秘钥 -
Step7:
后面客户端和服务器就用对称加密算法进行通信
0x02 https通信大致原理
在上面的通信过程中存在一些问题:客户端如何获得公钥?如何确保获得的公钥就是服务器的?
如果黑客生成一对公私钥,然后发给用户的话同样可以完成上述认证流程。
而证书正是为了解决这一问题而存在的,只要改变上面的Step3和Step4即可引入证书。
-
Step1:
客户端–>服务器:你好 -
Step2:
服务器–>客户端:你好,我是服务器(同时发送证书) -
Step3:
客户端–>服务端:- 判断证书是否为服务器的(证书中有服务器的公钥,若证书是服务器的则这个公钥就也是服务器的)
- 客户端向服务器发送随机生成的字符串string
-
Step4:
服务端–>客户端:- 服务器把string用自己的私钥进行加密,生成str
- 服务器把str发送给客户端
-
Step5:
客户端–>服务器:- 客户端收到服务器的数据str后,用服务器的公钥解密,生成string1
- 客户端将string1和string对比,若一致则说明对方确实是服务器(因为私钥加密后的内容只能由公钥解密,私钥只有服务器持有)
- 客户端选择一个对称加密算法和一个秘钥,用服务器公钥将他们加密发送给服务器,告诉服务器后续的通信用这个秘钥加密,因为公钥加密的数据只有私钥能解密,所以对称加密的算法和秘钥只有服务器知道
-
Step6:
服务器–>客户端: 服务器用私钥解密收到的数据得到对称加密算法及其秘钥 -
Step7:
后面客户端和服务器就用对称加密算法进行通信