HTTPS加密原理
概述
对HTTPS的加密原理是看一次,忘一次,因此想把自己对HTTPS的加密原理好好整理记录一下,方便下次忘了的时候好回顾。文章中大多内容是借鉴知乎大佬顾伊凡 YGY的文章,个人进行了简单的整理
HTTP和HTTPS的区别
HTTPS 协议是由 HTTP 加上 TLS/SSL 协议构建的可进行加密传输、身份认证的网络协议,主要通过数字证书、加密算法、非对称密钥等技术完成互联网数据传输加密,实现互联网传输安全保护。
加密算法
对称加密(密钥加解密)
采用单钥密码系统的加密方法,同一个密钥可以同时用作信息的加密和解密,这种加密方法称为对称加密,也称为单密钥加密。
优点:加密数据快。
缺点:加解密都需要用到密钥,当获取到密钥,便可将密文进行解密。
非对称加密(公钥加密,私钥解密):
对称加密算法在加密和解密时使用的是同一个秘钥;而非对称加密算法需要两个密钥来进行加密和解密,这两个密钥是公开密钥(public key,简称公钥)和私有密钥(private key,简称私钥)。
优点:安全性更高,只要确保私钥不外露,就可保障密文无法被解密。
缺点:加密速率慢,非对称加密算法非常耗时。
非对称加密+对称加密
结合对称加密和非对称加密的优点,就能保证既能在一定程度上保证安全和速度。过程如下:
- 某网站拥有用于非对称加密的公钥A、私钥A’。
- 浏览器向网站服务器请求,网站服务器把公钥A明文给传输浏览器。
- 浏览器随机生成一个用于对称加密的密钥X,用公钥A加密后传给网站服务器。
- 网站服务器拿到后用私钥A’解密得到密钥X。
- 这样双方就都拥有密钥X了,且别人无法知道它。之后双方所有数据都通过密钥X加密解密即可。
但这种方法并不完美,还存在中间人攻击
的可能。
中间人攻击
中间人攻击的思路,过程如下:
- 某网站有用于非对称加密的公钥A、私钥A’。
- 浏览器向网站服务器请求,服务器把公钥A明文给传输浏览器。
- 中间人劫持到公钥A,保存下来,把数据包中的公钥A替换成自己伪造的公钥B(它当然也拥有公钥B对应的私钥B’)。
- 浏览器生成一个用于对称加密的密钥X,用公钥B(浏览器无法得知公钥被替换了)加密后传给服务器。
- 中间人劫持后用私钥B’解密得到密钥X,再用公钥A加密后传给服务器。
- 服务器拿到后用私钥A’解密得到密钥X。
通过上述方法,中间人通过拿到密钥X,就能解密出通信的明文内容。为了解决这一安全隐患,因此便引入了**数字证书
**。
数字证书
网站在使用HTTPS前,需要向CA机构申领一份数字证书,数字证书里含有证书持有者信息(网站域名等)、公钥信息等。服务器把证书传输给浏览器,浏览器从证书里获取公钥就行了,证书就如身份证,证明该公钥对应该网站
。
数字签名
为了防止数字证书被篡改,又引入数字签名来进行防伪。
数字签名的制作过程:
- CA机构拥有非对称加密的公钥A、私钥A’。
- CA机构对证书明文数据T计算hash。
- 对hash后的值用私钥A’加密,得到数字签名S。
浏览器验证过程:
- 拿到证书,得到明文T,数字签名S。
- 用CA机构的公钥对S解密(由于是浏览器信任的机构,所以浏览器保有它的公钥),得到S’。
- 用证书里指明的hash算法对明文T进行hash得到T’。
- 显然通过以上步骤,T’应当等于S’,除非明文或签名被篡改。所以此时比较S’是否等于T’,等于则表明证书可信。
左侧是数字签名的制作过程,右侧是验证过程。
完整加密流程:非对称+对称加密+数字证书
- CA的根证书给某网站的非对称加密的公钥A、私钥A’。
- 浏览器向网站服务器请求,会返还该网站的证书,证书中有公钥A。
- 浏览器生成一个用于对称加密的密钥X,用公钥A加密后传给网站服务器。
- 服务器拿到后用私钥A’解密得到密钥X。
- 此时双方就都拥有密钥X了,之后双方所有数据都通过密钥X加密解密。
每次HTTPS请求时都必须在SSL/TLS层进行握手传输密钥吗?
如果每次请求都经历一次密钥传输的过程,这样非常耗时,如何实现只传输一次呢?
服务器会为每个浏览器(或客户端软件)维护一个session ID
,在TLS握手阶段传给浏览器,浏览器生成好密钥传给服务器后,服务器会把该密钥存到相应的session ID
下,之后浏览器每次请求都会携带session ID
,服务器会根据session ID
找到相应的密钥并进行解密加密操作,这样就不必要每次重新制作、传输密钥了!
上网行为管理的实现原理猜想
在我了解的一些上网行为管理的应用,都会提示要安装根证书。因此上网行为管理便是通过替换CA的根证书
为自己的根证书,这样就能做中间人攻击。具体流程如下:
- 某网站CA的根证书中的非对称加密的公钥A、私钥A’。
- 某上网行为管理的根证书中的非对称加密的公钥B、私钥B’。
- 浏览器向网站服务器请求,上网行为管理的根证书会返还公钥B。
- 浏览器生成一个用于对称加密的密钥X,用公钥B(浏览器无法得知公钥被替换了)加密后传给上网行为管理软件。
- 上网行为管理软件用私钥B’解密得到密钥X,再用公钥A加密后传给服务器。
- 服务器拿到后用私钥A’解密得到密钥X。
通过上述方法,上网行为管理软件通过拿到密钥X,就能解密出通信的明文内容。就能对用户上网访问的内容进行监控。
参考
顾伊凡 YGY大佬在知乎发的文章:https://zhuanlan.zhihu.com/p/43789231