HTTPS 如何实现安全通信

什么样的通信过程能称得上安全?

如果通信具备以下特征,那么就能称得上安全。

  1. 机密性,信息只能让可信的人看懂,对其他人是秘密。
  2. 完整性,信息在传输的过程中没有被截取和篡改。
  3. 身份认证,能够确认通信方的身份。
  4. 不可否认,不能够否认已经发生过的行为。

如何实现安全通信

  • 机密性

为了让通信双方的信息不被其他人看到,就需事先商量好要使用的密钥。这看上去能够实现机密性,但是通信的双方如何传递这个密钥呢。交换密钥的过程是可见的,一旦密钥被获取,通信内容就可以被破解。

为了解决密钥交换的问题,非对称加密便产生了。非对称加密使用两个密钥:公钥和私钥,公钥可以任意分发而私钥保密。首先某服务器产生公钥 a 和私钥 a’,浏览器拥有公钥 b 和 b’。浏览器把公钥 b 传输给服务器,服务器把公钥 a 传输给浏览器。之后浏览器向服务器传输的内容都用公钥 a 加密,服务器收到后用私钥 a’解密。同理服务器向浏览器传输的内容都用公钥加密,浏览器收到后用私钥 b’解密。非对称加密也有缺点,那就是运算速度很慢。

为了获取两种加密的优势,混合加密便产生了。首先某服务器产生公钥 a 和私钥 a’’。浏览器向服务器请求,服务器把公钥 a 给浏览器。浏览器随机生成一个用于对称加密的密钥 x, 用公钥 a 加密传给服务器,服务器拿到后用私钥 a’解密得到密钥 x,这样双方就都拥有密钥 x,其他人都无法知道,之后的数据都通过 x 加解密。

  • 完整性

只实现机密性,也不够安全。虽然别人看不了交互的信息,但是不能够免于被串改(直接修改加密后的信息,截取,颠倒顺序)。为了安全,我们还要验证信息的完整性,一般使用摘要算法来实现。摘要算法近似地理解成一种特殊的压缩算法,它能够把任意长度的数据“压缩”成固定长度、而且独一无二的“摘要”字符串,可以看成文件的指纹。摘要算法对输入具有“单向性”和“雪崩效应”,输入的微小不同会导致输出的剧烈变化,这样就可以很容易看出信息是否被修改。这个摘要会放在原信息的后面。摘要的算法也是由通信的双方在首次通信时就要确定好。

  • 不可否认 + 一部分身份认证

虽然有了摘要,但是还是不安全,因为它容易伪造。为了确保消息来源可靠, 我们还要加入数字签名的技术。即信息发送方把消息做摘要后,用自己的私钥把摘要的信息做一次加密。消息的接受方收到消息后,根据摘要算法,对消息提取一次摘要,接着用对方的公钥把消息尾部做了加密的摘要解密,然后把两份摘要做对比,如果一致则接受。

  • 身份认证

其实到上一步,我们已经实现了安全的四大特征了。但是这里还有一个“公钥的信任”问题。因为任何一方还是可能被冒充,你没有办法知道对方的真实身份。这时就需要引入一个值得信赖的中间机构 CA,由它来发证书证明身份。这里拿网站和浏览器来举例,网站想要一个证书,它找 CA 机构申请,CA 把申请者的信息和申请者的公钥绑定在一起,并用自己的私钥给该证书签名(证明申请人身份可信,证书是自己签发的),最后证书交给网站。浏览器向网站发起请求后,网站把该证书的证书链发给浏览器,然后浏览器就可以使用信任的根证书(根公钥)解析证书链的根证书得到一级证书的公钥+摘要验签,然后拿一级证书的公钥解密一级证书拿到二级证书的公钥和摘要验签,再然后拿二级证书的公钥解密二级证书得到服务器的公钥和摘要验签,确保证书中网站身份和公钥的可信。

证书体系也是有弱点的。如果 CA 失误或者被欺骗,签发了错误的证书,虽然证书是真的,可它代表的网站却是假的。还有一种更危险的情况,CA 被黑客攻陷,或者 CA 有恶意,因为它(即根证书)是信任的源头,整个信任链里的所有证书也就都不可信了。

证书的申请流程如下:

参考资料


波洋
1 声望0 粉丝