1. 关键词
哈希、加密、证书、签名、密钥协商、ECDH、TLS、DTLS
2. 通信风险
- 窃听风险(eavesdropping):第三方可以获知通信内容。
- 篡改风险(tampering):第三方可以修改通信内容。
- 冒充风险(pretending):第三方可以冒充他人身份参与通信。
3. 风险防范
- 信息加密传输,第三方无法窃听。
- 增加校验机制,一旦被篡改,通信双方会立刻发现。
- 配备身份证书,防止身份被冒充。
4. 哈希(Hash)
散列就是一种将任意长度的消息压缩到某一固定长度的消息摘要的过程。 SHA-512、MD5 等都是著名的散列函数,MD5 生成的散列码是 128 位,甚至 MD5 就是哈希的同名词,
5. 加密
5.1. 对称加密
对称加密就是加解密的密钥是一样的,优点是快,这也是传统的加密方式,像 AES、3DES 都是对称加密。
5.2. 非对称加密
非对称加密用于加解密的密钥不一样,有 2 个密钥,公钥和私钥,公钥可以公开,私钥妥善保管。RSA、ECC(椭圆曲线加密算法)、DH(密钥交换算法)这些都是非对称加密。
非对称加密很慢,有多慢?相比对称加密慢 1000 倍,因为慢,所以它常用于密钥协商(Handshake),协商出会话密钥后,再用对称密钥加密通信数据。
1976 年,Whitfield Diffie 和 Martin Hellman 首次提出了非对称加密的概念,该算法被称为 Diffie-Hellman 密钥交换。然后在 1978 年,麻省理工学院的 Ron Rivest,Adi Shamir 和 Leonard Adleman 发表了 RSA 算法。这些都可以被视为非对称加密的基础。
非对称加密也称为公钥基础结构,又称 PKI。
非对称加密算法用私钥加密,用公钥解密,或者用公钥加密,用私钥解密。
6. 证书
CA 是数字证书中心,服务器需要找 CA 做认证,让 CA 给自己颁布数字证书,数字证书内一般包含服务的一些信息、以及服务器的公钥,通过 CA 的私钥加密后,产生的数字证书,因为 CA 的权威性,且它的公钥天下皆知,所以,如果你能用 CA 的公钥解开证书,那便可证明该证书一定是 CA 颁发的,要不然它不会有 CA 的私钥,也便没法产生可用 CA 公钥解密的证书。
所以,由此可见,数字证书用到了非对称加密。
7. 数字签名
数字签名通常先对内容算哈希,产生内容摘要,再用私钥加密,得到签名。
8. 密钥协商
张三有 2 把钥匙,一把公钥,公告天下,一把私钥,妥善保管,只有自己知道,很明显,非对称加密。
李四给张三写信,写完之后,用张三的公钥加密,通过邮局寄给张三,即使邮递员拆开信封看,他也看不懂,因为内容是密文,只有张三的密钥才能解密。
张三收到信后,用私钥解密,可以正常阅读。
现在张三要给李四回信,写完后,用 hash 函数生成摘要 digest。
然后张三,再用私钥对摘要加密,生成数字签名 signature。
然后把签名附在信的下面,一起发给李四。
过程是:信明文 -> hash -> digist -> 私钥加密 -> signature。
李四收到回信后,用张三的公钥对数字签名解密,得到摘要,由此证明,信确实是张三发出的,为什么?因为如果不是张三发的,那写信的人就没有张三私钥,用别的私钥加密得到的签名,是无法用张三的公钥解开的。
李四,再对信的内容做 hash,得到摘要,与上一步得到的摘要对比,如果一致,则证明信的内容没有被修改过,信的内容是完整的。
复杂的情况出现了。
王五,用自己的公钥替换李四保存的张三的公钥,也就是王五欺骗了李四,李四误把王五的公钥当张三的公钥,这样一来,王五就能冒充张三给李四写信(王五用自己的私钥加密)。
问题是什么?问题是李四不能确信自己保存的公钥真的是张三的公钥。如果客户端电脑上存的工商银行官网的公钥,实际上是骗子公司的公钥,那就麻烦大了。
怎么破?让张三去认证中心 CA(Certificate Authority),为公钥做认证,怎么做呢?CA 中心用自己的私钥,对张三的公钥和其他相关信息一起加密,生成数字证书(Digital Certificate)。
张三拿到数字证书后,以后给李四回信,在签名的同时,附带上数字证书。
李四收到信之后,从 CA 的公钥解开数字证书,取出张三的公钥(一定是真的),然后就能放心的愉快的按之前的流程解开签名了。
数字证书加入后,核心区别就是张三的公钥不再保存在李四处,而是通过数字证书下发。
为什么数字证书里的张三的公钥一定是真的呢?因为 CA 是权威机构,假设全世界就一家(其实不止,但也不多),它的公钥天下尽知,就是固定的串,所以能用 CA 公钥解开的证书,一定是 CA 颁布的,因为 CA 用它的私钥加密产生的证书。很明显,非对称加密能用于证明我是我。
8.1. 密钥交换算法
Alice 和 Bob 要协商出一个公共的颜色,他们可以交换信息,但交换的信息,可以被偷看到,怎么办?既能协商出公共颜色,又不能让别人知道呢。
- 首先,他们有公共的颜色,都是 1 毫升黄色。
- 然后 Alice 挑选一个私密的红色,Bob 选绿色,都是 1 毫升。只有自己知道,不会告诉别人。
- 然后 Alice 把黄色和红色混合在一起,Bob 把黄色和绿色混合在一起,各为 2 毫升。
- 然后,他们把自己混合后的 2 毫升颜色液体,发给对方。
- 然后,用自己的一毫升私密颜色液体,跟从对方那里收到的 2 毫升液体,混合,下面就是见证奇迹的颜色的时刻,他们得到了相同的颜色,而第三方并不能通过偷看他们传递的数据知道他们最终得到的颜色(基于一个假设,图里有说明)。
密钥交换算法的原理跟这个差不多,网上有大量的资料讲述这个问题,我觉得理解了上面的例子,再看 ECDH 便也不难了。
众所周知 http 是互联网协议,但是它不够安全,所以后面有改进版的 https,其实就是多了一个 TLS,这个是传输层加密,本质上,就是通过 handshake,协商出一个会话密钥,后面的数据传递,都用这个密钥做对称加解密。
我们经常讲安全通道,其实也就是协商出一个会话密钥,他并不神秘。胡乱放几张图片吧。
为了减少这几个 RTT,又想了各种办法,然后复用连接的话,就可以做到 0RTT,1RTT 了。