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 的工作过程了。
握手流程
用户向 web 服务器发起一个安全连接的请求
服务器返回经过 CA 认证的数字证书,证书里面包含了服务器的 public key
用户拿到数字证书,用自己浏览器内置的 CA 证书解密得到服务器的 public key
用户用服务器的 public key 加密一个用于接下来的对称加密算法的密钥,传给 web 服务器因为只有服务器有 private key 可以解密,所以不用担心中间人拦截这个加密的密钥
服务器拿到这个加密的密钥,解密获取密钥,再使用对称加密算法,和用户完成接下来的网络通信
最后更新于