开放网络中数据传输的安全性一直是一个热门话题,特别是电子商务兴起的今天,各种攻击和欺骗手段更是层出不穷,安全的网络传输需求也愈显重要。互联网发展至今天,已经有比较成熟的解决方案,最典型的就是 HTTPS(安全套接层超文本传输协议)。它通过在应用层和传输层之间增加安全层,对数据进行加密和解密,以保证信息不被第三方窃听和篡改,如下图:

说到信息加密,就不得不说几种常见的加密方式:对称加密、非对称加密和哈希算法。
- 对称加密(Symmetric-key algorithm):采用单密钥密码系统,同一个密钥可以同时用作信息的加密和解密,这种加密方法称为对称加密,也称为单密钥加密。常见的对称加密算法有 DES、3DES 等。
- 非对称加密(Asymmetric cryptographic algorithm):采用成对的公开密钥和私有密钥。如果用公开密钥对数据进行加密,只有对应的私有密钥才能解密;如果用私有密钥进行签名,则可以使用对应的公开密钥进行验证。常见的非对称加密算法有 RSA、ECC 等。
- 哈希算法(Secure Hash Algorithm):又称安全散列算法,将任意长度的数据映射为固定长度的哈希值。哈希算法通常具有不可逆、难以找到碰撞等特性。常见的哈希算法有 MD5、SHA-1 等。
无论有多少种算法,最终要解决的问题主要有两个:防止信息在不可信网络上传输时被窃听,以及防止信息被篡改。那么这几种算法是如何防止信息被窃听或者篡改的呢?各自又有什么优缺点?
对称加密中,加密和解密的双方使用相同的密钥,只要相关的加密算法足够可靠,那么信息被直接破解的可能性就会非常小。但是,由于双方使用相同的密钥,密钥的分发就成了一个非常大的问题。一旦加密密钥被获取,整个信息就毫无安全性可言。
非对称加密就是为了解决对称加密中遇到的问题而出现的。它采用公钥和私钥的机制,由于公钥可以公开分发,所以不存在公钥本身需要保密的问题。但是这又会产生第二个问题:第三方可能冒充公钥所有者向用户提供伪造的公钥,以达到窃听的目的,如下图:

当 A 和 B 通过非对称加密传递信息时,可能会出现中间人 C。C 自己产生一对公钥和私钥,然后冒充 A 把自己的公钥传递给 B,B 会认为这是 A 的公钥。接下来传递消息时,就会变成 B 用 C 的公钥加密,C 用自己的私钥解密并查看信息,然后再用 A 的公钥加密传递给 A。由于 C 加密时使用的是 A 的公钥,最终 A 仍然能够用自己的私钥解密。
整个过程中,看起来 A 和 B 建立了一条安全通道,其实加密的信息已经被中间人窃听了。
为了解决信息被篡改的问题,数字签名出现了。和现实中的签名一样,数字签名也是在原文的基础上附加签名。通常的做法是先用哈希算法生成信息指纹,然后使用私钥对指纹进行签名,最后附到信息后面。当另一方接收到信息时,先用哈希算法计算出信息指纹,再使用公钥验证数字签名。如果两个结果一致,则证明信息没有被篡改。如下:

虽然有了数字签名,但是仍然不能避免上面所说的“中间人攻击”,因为整个密钥管理体系还不完整,无法确认收到的公钥是否是第三方伪造的。最后的问题就变成了:如何认证一个公钥是否合法?
这时候,数字证书就出现了。
数字证书可以简单理解为由身份认证机构对身份和公钥进行认证后签发的证明。CA 是证书的签发机构,它负责签发证书、认证证书,并管理已经颁发的证书。CA 需要制定相应的政策和步骤来验证、识别用户身份,并对证书进行签名,以确保证书持有者的身份和公钥之间存在对应关系。
说了这么多,其实原理很简单,就是增加一个管理机构(CA)专门来管理和认证公钥。
数字证书最常见的是 X.509 标准,其中通常包含版本、序列号、算法标识、颁发者、使用者、有效期、使用者的公钥以及签名等信息。
那么它究竟是如何做到不能被伪造的呢?答案就在于数字签名。
当需要申请证书时,申请者向 CA 提供相关信息,CA 审核之后,使用自己的私钥对证书中的内容进行数字签名,这样就形成了一张数字证书。当用户获取到这个数字证书时,就可以利用系统中预先安装或信任的 CA 公钥来验证证书上的数字签名。如果验证通过,就可以确认该证书确实由对应的 CA 签发,并且证书内容没有被篡改。下图描述了这一过程:

通过 CA 和数字证书,可以解决公钥真实性的问题,并在一定程度上避免信息在传输过程中被窃听和篡改。至于具体 HTTPS 的握手过程和数据传输机制,还需要进一步细化,后面有机会再做深入研究。
评论1
欢迎分享你的看法,也欢迎补充不同的实践经验。