HTTPS

传输层安全

  • 数据不被窃听

  • 数据不被篡改

  • 身份验证

加密

  • 对称加密

密钥双方存有,都可以进行加密和解密,如果密钥泄漏了,那么就相当于泄密了。

  • 非对称加密

密钥分为两种,一种为公钥,公钥公开,所有人都可获取;另一种为私钥,不可被别人获取。加密时使用公钥进行加密,解密时使用私钥进行解密。

SSL 原理

如果使用非对称加密,A 和 B 要通过网络交换 public key。如果中间人 C 在中间拦截了呢? 假设有这种情况,C 拦截了 A 和 B 的 public key,又分别用自己的 public key 发给 A 和 B。A 和 B 并不知道,他们还以为这个 public key 来自对方。当 A 给 B 发消息时,A 先用自己的 private key 加密数据的 hash 值,之后用 C 传来的假的 public key 加密数据,再发出去。C 拦截到之后,先用 C 自己的 private key 解密数据,C 就获取了 A 的原始信息。 之后,C 可以篡改数据内容,再用自己的 private key 加密数据的 hash 值,用之前拦截的 B 的 public key 加密数据,再发给 B。B 收到以后,先用自己的 private key 解密数据,再用 C 传来的假 public key 解密 hash 值,发现匹配。这样,B 收到了一条来自 C 的假的信息,但是 B 还以为信息来自于 A。中间人攻击仍然可能存在。 问题出就出在最开始通过网络交换 public key。看起来为了保证 public key 不被拦截,A 和 B 似乎还是要见一面,交换一下 public key。这一下就回到了上古时代。不过,虽然 A 和 B 现在还是要见一面,但见面的实质已经变了。在上古时代,见面是为了商量一个密钥,密钥的内容很重要,不能让别人知道密钥的内容。而在现代,见面是为了确认 public key 的真实性,public key 的内容是可以公开的。那如果有其他办法能保证 public key 的真实性,A 和 B 是可以不用见面交换 public key 的。

CA

现实中,通过 CA(Certificate Authority)来保证 public key 的真实性。CA 也是基于非对称加密算法来工作。有了 CA,B 会先把自己的 public key(和一些其他信息)交给 CA。CA 用自己的 private key 加密这些数据,加密完的数据称为 B 的数字证书。现在 B 要向 A 传递 public key,B 传递的是 CA 加密之后的数字证书。A 收到以后,会通过 CA 发布的 CA 证书(包含了 CA 的 public key),来解密 B 的数字证书,从而获得 B 的 public key。

CA 的大杀器就是,CA 把自己的 CA 证书集成在了浏览器和操作系统里面。A 拿到浏览器或者操作系统的时候,已经有了 CA 证书,没有必要通过网络获取,那自然也不存在劫持的问题。现在 A 和 B 都有了 CA 认证的数字证书。在交换 public key 的阶段,直接交换彼此的数字证书就行。而中间人 C,还是可以拦截 A 和 B 的 public key,也可以用 CA 证书解密获得 A 和 B 的 public key。但是,C 没有办法伪造 public key 了。因为 C 不在 CA 体系里面,C 没有 CA 的 private key,所以 C 是没有办法伪造出一个可以通过 CA 认证的数字证书。如果不能通过 CA 认证,A 和 B 自然也不会相信这个伪造的证书。所以,采用 CA 认证以后,A 和 B 的 public key 的真实性得到了保证,A 和 B 可以通过网络交换 public key(实际是被 CA 加密之后的数字证书)。

实际使用非对称加密算法比对称加密算法要复杂的多,处理起来也要慢得多。如果所有的网络数据都用非对称加密算法来加密,那效率会很低。所以在实际中,非对称加密只会用来传递一条信息,那就是用于对称加密的密钥。当用于对称加密的密钥确定了,A 和 B 还是通过对称加密算法进行网络通信。这样,既保证了网络通信的安全性,又不影响效率,A 和 B 也不用见面商量密钥了。所以,在现代,A 和 B 之间要进行安全,省心的网络通信,需要经过以下几个步骤通过 CA 体系交换 public key 通过非对称加密算法,交换用于对称加密的密钥通过对称加密算法,加密正常的网络通信这基本就是 SSL/TLS 的工作过程了。

握手流程

  1. 用户向 web 服务器发起一个安全连接的请求

  2. 服务器返回经过 CA 认证的数字证书,证书里面包含了服务器的 public key

  3. 用户拿到数字证书,用自己浏览器内置的 CA 证书解密得到服务器的 public key

  4. 用户用服务器的 public key 加密一个用于接下来的对称加密算法的密钥,传给 web 服务器因为只有服务器有 private key 可以解密,所以不用担心中间人拦截这个加密的密钥

  5. 服务器拿到这个加密的密钥,解密获取密钥,再使用对称加密算法,和用户完成接下来的网络通信

最后更新于