互联网|万字长文拿下HTTPS,面试不再慌!( 五 )


本文插图
这样混合加密就解决了对称加密算法的密钥交换问题 , 而且安全和性能兼顾 , 完美地实现了机密性 。

完整性
摘要算法
实现完整性的手段主要是摘要算法(Digest Algorithm) , 也就是常说的散列函数、哈希函数(Hash Function) 。

你可以把摘要算法近似地理解成一种特殊的压缩算法 , 它能够把任意长度的数据压缩成固定长度、而且独一无二的摘要字符串 , 就好像是给这段数据生成了一个数字指纹 。
换一个角度 , 也可以把摘要算法理解成特殊的单向加密算法 , 它只有算法 , 没有密钥 , 加密后的数据无法解密 , 不能从摘要逆推出原文 。
摘要算法实际上是把数据从一个 大空间映射到了小空间 , 所以就存在冲突(collision , 也叫碰撞)的可能性 , 就如同现实中的指纹一样 , 可能会有两份不同的原文对应相同的摘要 。
好的摘要算法必须能够抵抗冲突 , 让这种可能性尽量地小 。 因为摘要算法对输入具有单向性和雪崩效应 , 输入的微小不同会导致输出的剧烈变化 , 所以也被 TLS 用来生成伪随机数(PRF , pseudo random function) 。
你一定在日常工作中听过、或者用过 MD5(Message-Digest 5)、SHA-1(Secure Hash Algorithm 1) , 它们就是最常用的两个摘要算法 , 能够生成 16 字节和 20 字节长度的数字摘要 。
但这两个算法的安全强度比较低 , 不够安全 , 在 TLS 里已经被禁止使用了 。 目前 TLS 推荐使用的是 SHA-1 的后继者:SHA-2 。

SHA-2 实际上是一系列摘要算法的统称 , 总共有 6 种 , 常用的有 SHA224、SHA256、SHA384 , 分别能够生成 28 字节、32 字节、48 字节的摘要 。
摘要算法保证了数字摘要和原文是完全等价的 。 所以 , 我们只要在原文后附上它的摘要 , 就能够保证数据的完整性 。
比如 , 你发了条消息:有内鬼 , 终止交易 , 然后再加上一个 SHA-2 的摘要 。 网站收到后也计算一下消息的摘要 , 把这两份指纹做个对比 , 如果一致 , 就说明消息是完整可信的 , 没有被修改 。
如果黑客在中间哪怕改动了一个标点符号 , 摘要也会完全不同 , 网站计算比对就会发现消息被窜改 , 是不可信的 。
不过摘要算法不具有机密性 , 如果明文传输 , 那么黑客可以修改消息后把摘要也一起改了 , 网站还是鉴别不出完整性 。
所以 , 真正的完整性必须要建立在机密性之上 , 在混合加密系统里用会话密钥加密消息和摘要 , 这样黑客无法得知明文 , 也就没有办法动手脚了 。
这有个术语 , 叫哈希消息认证码(HMAC) 。
互联网|万字长文拿下HTTPS,面试不再慌!
本文插图
数字签名

加密算法结合摘要算法 , 我们的通信过程可以说是比较安全了 。 但这里还有漏洞 , 就是通信的两个端点(endpoint) 。

就像一开始所说的 , 黑客可以伪装成网站来窃取信息 。 而反过来 , 他也可以伪装成你 , 向网站发送支付、转账等消息 , 网站没有办法确认你的身份 , 钱可能就这么被偷走了 。
现实生活中 , 解决身份认证的手段是签名和印章 , 只要在纸上写下签名或者盖个章 , 就能够证明这份文件确实是由本人而不是其他人发出的 。
回想一下上面的介绍在 TLS 里有什么东西和现实中的签名、印章很像 , 只能由本人持有 , 而其他任何人都不会有呢?只要用这个东西 , 就能够在数字世界里证明你的身份 。
没错 , 这个东西就是非对称加密里的私钥 , 使用私钥再加上摘要算法 , 就能够实现数字签名 , 同时实现身份认证和不可否认 。
数字签名的原理其实很简单 , 就是把公钥私钥的用法反过来 , 之前是公钥加密、私钥解密 , 现在是私钥加密、公钥解密 。


推荐阅读