![](https://cdn.nlark.com/yuque/0/2018/png/101969/1535508858982-09c0d3f9-a290-4eef-b6d1-705e7c455225.png)
原文链接:https://medium.freecodecamp.org/https-explained-with-carrier-pigeons-7029d2193351
更好的译文版本:https://www.oschina.net/translate/https-explained-with-carrier-pigeons
密码学算得上是个难以理解的主题。它充斥着各种数学证明。但除非你需要实际开发加密系统,否则从应用层上大部分的复杂性都无需去深究 。
如果你希望看了这篇文章就能创造下一个 HTTPS 协议,我很遗憾地说光有鸽子是不够的。还是先煮杯咖啡,享受美文吧。
Alice、Bob 和……信鸽?
你在网络上的所有操作(阅读这篇文章,在淘宝上买东西,上传主子的图片)都归结到同服务器间收发消息。
这说起来有点抽象,不如假想为这些消息都通过信鸽来传递。我知道这样比喻看起来有点随意,但相信我,HTTPS 的工作方式确实与此类似,只不过快了很多。
同样我们不再讨论服务器、用户和黑客,而是讨论 Alice、Bob 和 Mallory。
原始的通信
如果 Alice 想给 Bob 发送一条消息,她将消息系在信鸽的腿上,然后信鸽将消息带到 Bob 那。Bob 接收到消息,读取消息,一切正常。
但如果 Mallory 在 Alice 的信鸽飞行的途中将其拦截下来并篡改消息会发生什么?Bob 没法知道来自于 Alice 的消息在传递过程中有无被篡改。
这就是 HTTP 的工作流程。是不是有点可怕?我永远不会通过 HTTP 发送我的银行卡密码,劝你也不要这样做。
加密
如果 Alice 和 Bob 都非常的机智。他们就会一致决定使用加密后的代码来传递消息。例如将每个字母替换为其字母表中靠前 3 个位置的字母。D→A,E→B,F→C。纯文本消息“secret message”将被加密为“pbzobq jbppxdb”。
这样如果 Mallory 再拦截到信鸽,由于她不知道密码,所以她无法将消息篡改为别的有意义的消息,也无法理解其中的内容。但 Bob 可以会轻松的通过反向移位字母来解密消息,其中 A→D,B→E,C→F。密文“pbzobq jbppxdb”将被解密回“secret message”。
大功告成!
这就是对称加密(symmetric key cryptography),即如果你知道加密消息的方法,你也就知道如何解密它了。
我上面描述的加密方式通常称为凯撒加密法(Caesar cipher)。在现实生活中,我们使用更高级、更复杂的加密方式,但核心思想是相同的。
我们该如何设置钥匙?
如果除了发送方和接收方之外没人知道使用了什么密钥,则对称加密是非常安全的。在凯撒加密法中,关键是我们每个字母移动的偏移量。在我们的例子中,偏移量为 3,但也可以用 4 或 12。
问题是如果 Alice 和 Bob 在开始用信鸽发送消息前没有见过面,他们就将无法安全地建立密钥。如果他们在消息本身中发送密钥,Mallory 将拦截消息并发现密钥。这就使得 Mallory 可以通过掌握的密钥,解密和篡改 Alice 和 Bob 间收发的消息。
这是中间人攻击的典型示例,避免它的唯一方法是彻底更改加密系统。
带着盒子的信鸽
所以 Alice 和 Bob 想出了一个更好的系统。当 Bob 想要给 Alice 发送消息时,她将按照以下步骤操作:
- Bob 向 Alice 发一个没有携带任何消息的信鸽
- Alice 把信鸽送回来,信鸽带着一个打开了锁的盒子,而 Alice 自己保留了钥匙
- Bob 将消息放入盒子中,把锁关上,再将信鸽发给 Alice
- Alice 收到盒子,用钥匙打开它并读取消息
这样,因为 Mallory 没有钥匙,她就无法通过拦截信鸽来篡改信息。当 Alice 想要向 Bob 发送消息时,遵循相同的过程。
Alice 和 Bob 刚才用到的就是常说的非对称加密(asymmetric key cryptography)。之所以被称为非对称,是因为即使你可以加密一条消息(锁上盒子)你也无法解密它(打开一个加锁了的盒子)。
用专业术语来说,这个盒子被称为公钥,打开它的密钥称为私钥。
如何信任盒子?
如果你足够细心,你可能已经注意到上面的方法仍然有问题。当 Bob 收到那个打开的盒子时,他怎么能确定它来自 Alice 并且 Mallory 没有拦截鸽子并将盒子替换成她自己有钥匙的盒子?
Alice 决定在盒子上签名,这样当 Bob 收到盒子时,他只需检查签名便知道这是否是 Alice 发送过来的。
你们当中有些人可能会想,首先 Bob 要如何识别 Alice 的签名?好问题。Alice 和 Bob 也纠结着呢,所以他们最终决定,Alice 不签名,而是 Ted 给盒子签名。
Ted 有是谁?Ted 是一位非常着名且值得信赖的人。Ted 替每个合法的人士签名,大家也相信他只会替合法的人士签名。
Ted 只会在确定要求给盒子签名的人是 Alice 后,才会帮 Alice 签名。这样 Mallory 就无法弄到由 Ted 签名了的 Alice 的盒子,因此 Bob 可以一眼辨认盒子的真假。
在专业术语中,Ted 通常被称为证书颁发机构(Certification Authority),您正在阅读本文的浏览器附带了各种证书颁发机构的签名。
因此,当你第一次连接到一个网站时,你信任了它的盒子,因为你相信 Ted 和 Ted 告诉你这个盒子是合法的。
盒子太重
Alice 和 Bob 现在拥有一个可靠的通信系统,但他们也意识到携带盒子的信鸽比只携带消息的信鸽飞得慢。
他们决定只使用盒子(非对称加密)加密对称加密的密钥(想起凯撒加密法了吗?)。
这种方式,两全其美。既有非对称加密的可靠性又有对称加密的效率。
在现实世界中,虽然没有慢悠悠飞信的信鸽,但非对称加密比对称加密慢,所以我们只使用它来交换加密密钥。
现在你知道 HTTPS 是如何工作了,你的咖啡也应该准备好了。去享受它吧😉