Saber2pr's Blog

HTTP加密

为什么需要加密?

因为 http 的内容是明文传输的,会经过中间代理服务器、路由器、wifi 热点、通信服务运营商等多个物理节点,如果信息在传输过程中被劫持,传输的内容就完全暴露了,可以篡改传输的信息且不被双方察觉,这就是中间人攻击。所以需要对信息进行加密。

对称加密

一个密钥,它可以对一段内容加密,加密后只能用它才能解密看到原本的内容。

传输过程:

  1. 由服务器生成一个密钥并明文传输给浏览器。
  2. 浏览器把内容用密钥加密后返回给服务器。
  3. 服务器用密钥解密得到内容。

缺陷:密钥被中间人劫持失效。

非对称加密

两把密钥,一把公钥、一把私钥。用公钥加密的内容用私钥才能解开,同样,私钥加密的内容只有公钥能解开。

传输过程:

  1. 服务器把公钥明文传输给浏览器。
  2. 浏览器把内容用公钥加密后返回给服务器。
  3. 服务器用私钥解密得到内容。

中间人即使劫持到公钥也无法对传输内容解密。

缺陷:公钥可以解密从服务器传给浏览器的内容。

非对称加密 (改良)

用两组公钥私钥

缺陷:非对称加密算法非常耗时

非对称加密+对称加密 混合加密 (HTTPS)

传输过程:

  1. 服务器把公钥传输给浏览器。
  2. 浏览器随机生成一个用于对称加密的密钥 X,用公钥加密后传给服务器。
  3. 服务器用私钥解密得到密钥 X。
  4. 这样双方都拥有密钥 X 了。之后双方所有数据都用密钥 X 加密解密。

漏洞:

  1. 中间人准备了一对公钥 B、私钥 B。
  2. 在服务器把公钥 A 传输给浏览器时,中间人将其调包为自己的公钥 B 返回给浏览器,并将公钥 A 保存。
  3. 浏览器用公钥 B 加密内容发送,中间人用自己的私钥 B 解密得到内容,然后其调包为原来的公钥 A 再返回给服务器。
  4. 服务器用私钥 A 解密得到被中间人劫持过的内容。

需要解决:在第 2 步中证明浏览器收到的公钥一定是从服务器发来的公钥,而不是中间人的假冒品。

CA 认证

漏洞:伪造 CA 证书。

数字签名

为内容生成一份“签名”,比对内容和签名是否一致就能察觉是否被篡改。

数字签名的生成过程:

  1. CA 拥有一对非对称加密的私钥和公钥。
  2. CA 对证书明文信息进行 hash。
  3. 对 hash 后的值用私钥加密,得到数字签名。

浏览器验证过程:

主要就是对数字签名进行解密。与内容做对比。

  1. 得到 [被 CA 私钥加密过的] 内容 和 数字签名。

  2. 用 CA 机构的公钥对 加密过的数字签名 解密,得到 数字签名。

由于 CA 是浏览器信任的机构,所以浏览器保有 CA 的公钥。

  1. 用证书里说明的 hash 算法对 数字签名 进行 hash 得到 [被数字签名保护内容]。
  2. 比较 [被数字签名保护内容] 是否等于 内容,等于则表明证书可信。

为什么需要 hash ?

hash 后得到的是固定长度的信息加密解密会快很多。

如何证明 CA 公钥是可信的?

浏览器保有 CA 公钥,怎么证明这个公钥是否可信?

操作系统、浏览器本身会预装一些它们信任的根证书(例如 CA 证书)。

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

服务器会为每个浏览器(或客户端软件)维护一个 session ID,在 TSL 握手阶段传给浏览器,密钥会缓存到 session。在会话期间不需要重复认证。