HTTPS的加密原理

概述

对HTTPS的加密原理是看一次,忘一次,因此想把自己对HTTPS的加密原理好好整理记录一下,方便下次忘了的时候好回顾。文章中大多内容是借鉴知乎大佬顾伊凡 YGY的文章,个人进行了简单的整理

HTTP和HTTPS的区别

HTTPS 协议是由 HTTP 加上 TLS/SSL 协议构建的可进行加密传输、身份认证的网络协议,主要通过数字证书加密算法、非对称密钥等技术完成互联网数据传输加密,实现互联网传输安全保护。

https

加密算法

对称加密(密钥加解密)

采用单钥密码系统的加密方法,同一个密钥可以同时用作信息的加密和解密,这种加密方法称为对称加密,也称为单密钥加密。

优点:加密数据快。

缺点:加解密都需要用到密钥,当获取到密钥,便可将密文进行解密。

非对称加密(公钥加密,私钥解密):

对称加密算法加密和解密时使用的是同一个秘钥;而非对称加密算法需要两个密钥来进行加密和解密,这两个密钥是公开密钥(public key,简称公钥)和私有密钥(private key,简称私钥)。

优点:安全性更高,只要确保私钥不外露,就可保障密文无法被解密。

缺点:加密速率慢,非对称加密算法非常耗时。

非对称加密+对称加密

结合对称加密和非对称加密的优点,就能保证既能在一定程度上保证安全和速度。过程如下:

  1. 某网站拥有用于非对称加密的公钥A、私钥A’。
  2. 浏览器向网站服务器请求,网站服务器把公钥A明文给传输浏览器。
  3. 浏览器随机生成一个用于对称加密的密钥X,用公钥A加密后传给网站服务器。
  4. 网站服务器拿到后用私钥A’解密得到密钥X。
  5. 这样双方就都拥有密钥X了,且别人无法知道它。之后双方所有数据都通过密钥X加密解密即可。

但这种方法并不完美,还存在中间人攻击的可能。

中间人攻击

中间人攻击的思路,过程如下:

  1. 某网站有用于非对称加密的公钥A、私钥A’。
  2. 浏览器向网站服务器请求,服务器把公钥A明文给传输浏览器。
  3. 中间人劫持到公钥A,保存下来,把数据包中的公钥A替换成自己伪造的公钥B(它当然也拥有公钥B对应的私钥B’)
  4. 浏览器生成一个用于对称加密的密钥X,用公钥B(浏览器无法得知公钥被替换了)加密后传给服务器。
  5. 中间人劫持后用私钥B’解密得到密钥X,再用公钥A加密后传给服务器
  6. 服务器拿到后用私钥A’解密得到密钥X。

通过上述方法,中间人通过拿到密钥X,就能解密出通信的明文内容。为了解决这一安全隐患,因此便引入了**数字证书**。

数字证书

网站在使用HTTPS前,需要向CA机构申领一份数字证书,数字证书里含有证书持有者信息(网站域名等)、公钥信息等。服务器把证书传输给浏览器,浏览器从证书里获取公钥就行了,证书就如身份证,证明该公钥对应该网站

数字签名

为了防止数字证书被篡改,又引入数字签名来进行防伪。

数字签名的制作过程:

  1. CA机构拥有非对称加密的公钥A、私钥A’。
  2. CA机构对证书明文数据T计算hash。
  3. 对hash后的值用私钥A’加密,得到数字签名S。

浏览器验证过程:

  1. 拿到证书,得到明文T,数字签名S。
  2. 用CA机构的公钥对S解密(由于是浏览器信任的机构,所以浏览器保有它的公钥),得到S’。
  3. 用证书里指明的hash算法对明文T进行hash得到T’。
  4. 显然通过以上步骤,T’应当等于S’,除非明文或签名被篡改。所以此时比较S’是否等于T’,等于则表明证书可信。

how-do-digital-signatures-and-digital-certificates-work-together-in-ssl

左侧是数字签名的制作过程,右侧是验证过程。

完整加密流程:非对称+对称加密+数字证书

  1. CA的根证书给某网站的非对称加密的公钥A、私钥A’。
  2. 浏览器向网站服务器请求,会返还该网站的证书,证书中有公钥A。
  3. 浏览器生成一个用于对称加密的密钥X,用公钥A加密后传给网站服务器。
  4. 服务器拿到后用私钥A’解密得到密钥X。
  5. 此时双方就都拥有密钥X了,之后双方所有数据都通过密钥X加密解密。

contact

每次HTTPS请求时都必须在SSL/TLS层进行握手传输密钥吗?

如果每次请求都经历一次密钥传输的过程,这样非常耗时,如何实现只传输一次呢?

服务器会为每个浏览器(或客户端软件)维护一个session ID,在TLS握手阶段传给浏览器,浏览器生成好密钥传给服务器后,服务器会把该密钥存到相应的session ID下,之后浏览器每次请求都会携带session ID,服务器会根据session ID找到相应的密钥并进行解密加密操作,这样就不必要每次重新制作、传输密钥了!

上网行为管理的实现原理猜想

在我了解的一些上网行为管理的应用,都会提示要安装根证书。因此上网行为管理便是通过替换CA的根证书为自己的根证书,这样就能做中间人攻击。具体流程如下:

  1. 某网站CA的根证书中的非对称加密的公钥A、私钥A’。
  2. 某上网行为管理的根证书中的非对称加密的公钥B、私钥B’。
  3. 浏览器向网站服务器请求,上网行为管理的根证书会返还公钥B。
  4. 浏览器生成一个用于对称加密的密钥X,用公钥B(浏览器无法得知公钥被替换了)加密后传给上网行为管理软件。
  5. 上网行为管理软件用私钥B’解密得到密钥X,再用公钥A加密后传给服务器
  6. 服务器拿到后用私钥A’解密得到密钥X。

通过上述方法,上网行为管理软件通过拿到密钥X,就能解密出通信的明文内容。就能对用户上网访问的内容进行监控。

参考

顾伊凡 YGY大佬在知乎发的文章:https://zhuanlan.zhihu.com/p/43789231