[译] [转载]用信鸽来解释HTTPS

[译] 用信鸽来解释HTTPS - DobyAsa's

原文icon-default.png?t=N2N8https://baida.dev/articles/https-explained-with-carrier-pigeonsBaida | HTTPS explained with carrier pigeons

密码学是一个很难理解的学科,它里面全都是满满的数学证明。但其实如果你不是真的在开发一个密码系统,只是想要宏观地理解一下发生了什么的话,密码学里面很多复杂的东西是没有必要的。

如果你打开这个文章是想要创造出下一个 HTTPS 协议的话,我只能很抱歉地告诉你只靠鸽子可能是不够了... 但是如果不是的话,你可以煮一杯咖啡然后享受这篇文章了。

Alice,Bob 和... 鸽子?

你在网上进行的任何活动(比如读一篇文章,从淘宝上买一个东西,上传一张猫的图片)都可以归结为发送信息到服务器或者从服务器读取信息回来。
这个说法可能听起来很抽象,所以我们可以想象一下这些信息是由信鸽来送过去的。我知道这可能听起来非常的随意,但是相信我,实际上 HTTPS 工作起来跟这没什么两样,尽管 HTTPS 要快上不少。
同样的,我们用 Alice,Bob 和 Mallory 这三个人来代替服务器,客户端和黑客的角色。如果你不是第一次尝试了解加密的概念的话,你应该能够认出来这几个名字,因为这几个名字被广泛得使用在技术文章里面。

✉️ 第一次朴素的通讯

如果 Alice 想要给 Bob 发送信件的话,她可以直接把信件绑在信鸽的腿上然后让信鸽飞向 Bob。Bob 在接收到信后就可以愉快地阅读 Alice 发来的信息了。
但是如果 Mallory 在 Alice 的鸽子还在飞行的途中把信鸽拦截下来,然后偷偷篡改了信的内容怎么办?Bob 是无法知道 Alice 送来的信有没有在送来的途中被修改的。
上面其实就是 HTTP 工作的方式。看起来是不是很恐怖?我可不想我的银行凭证通过 HTTP 来发送,相信你们其实也不想这样。

通过密码

那如果 Alice 跟 Bob 很聪明的话,他们可能就会用某种编码密钥来写信。比如他们可以将每个字母移动字母表上的三个位置。比如 D -> A, E -> B, F -> C。这样的话 "secret message" 就会被加密成 “pbzobq jbppxdb”。
现在如果 Mallory 截获了信鸽的话,她没办法将信的内容改为其他有意义的内容内容,也没办法读懂信里写了什么了,因为她并不知道信是如何加密的。但是 Bob 是可以轻松地解密这个文本,只需要逆着加密方式来替换字母就行了。“pbzobq jbppxdb” 就会被解密成 "secret message"。
所以这就成功了!
这种方式就叫做对称式密钥加密,因为如果你知道如何加密的话,那么你同样也知道该如何加密。
上面我描述的加密方式就是众所周知的凯撒密码。在现实生活中,我们会使用更加精妙,更加复杂的加密方式,但是基本思路是差不多的。

那我们怎么决定加密方式呢?

如果除了发送方和接收方之外没有人知道使用了什么密钥,那么对称密钥加密是非常安全的。在凯撒密码中,密钥是我们移动每个字母的数量的偏移量。在我们的示例中,我们使用了3的偏移量,但也可以使用4或12。
问题是,如果 Alice 和 Bob 在开始用鸽子发送消息之前没有见面,他们就没有办法安全地建立一个密钥。如果他们把密钥放进信息里,Mallory 就会拦截信息并找到密钥。这将使 Mallory 可以在 Alice 和 Bob 开始加密他们的消息之前和之后按照自己的意愿读取或更改消息。
这是一个典型的中间人攻击的例子,唯一避免它的方式是整个改变这个加密系统。

带着盒子的鸽子

所以 Alice 和 Bob 想出来了一个更好的系统。当 Bob 想要给 Alice 写信的时候,他会按照以下步骤在进行:

  • Bob 放出一个没有携带任何信件的信鸽给 Alice。
  • Alice 放出一个信鸽,但是这个信鸽带的就不是信了,而是一个带着锁的盒子, Alice 寄出的盒子锁是打开的,锁的钥匙 Alice 自己留着。
  • Bob 将信放在盒子里,然后锁上锁发给 Alice。
  • Alice 收到了盒子,用自己的钥匙打开这个盒子,然后读取这个信件。
    这就是为什么 Mallory 拦截了信鸽也无法改变消息的内容,因为她没有钥匙来打开盒子。如果 Alice 想要给 Bob 发送信件也是相同的程序。
    Alice 跟 Bob 用的就是广为人知的非对称密钥加密。它之所以被叫做非对称,是因为尽管你能加密一个信息(锁上盒子),但是你不能够解密(打开盒子)。从技术上来说,盒子就是公钥而用来打开盒子的钥匙就是私钥

❓ 该如何相信这个盒子呢?

你可能也注意到了,我们这里依然有一个问题。当 Bob 收到 Alice 寄来的盒子的时候,他如何能确定这个盒子是 Alice 的盒子,而不是 Mallory 截获了鸽子后换的自己的盒子呢?
Alice 现在决定她会在盒子上签名,这样的话当 Bob 收到这个盒子的时候,他就可以检查这个签名然后知道是 Alice 给他寄的盒子。
这个时候你可能会想,那 Bob 一开始又是如何知道 Alice 的签名长什么样的呢?这是个好问题,Alice 跟 Bob 同样有这些问题,所以他们决定不是由 Alice 在盒子上签名,而是由另一个人 Ted 在盒子上签名。
那 Ted 又是谁呢?Ted 是一个非常出名的人,一个即出名又值得信任的人。Ted 把自己的签名给了所有人,而且所有人都相信他只会帮合法的人签名。
如果 Ted 能确定想找他帮忙签名的人就是 Alice 的话,那么 Ted 将只会给 Alice 的盒子签名。所以 Mallory 是没办法也搞到一个有 Ted 代表 Alice 签名的盒子,因为 Ted 只会给确认过身份的人签名。
Ted 从技术上来说扮演的就是 认证机构(CA)的角色,而你正在用来阅读这篇文章的浏览器带有各种认证机构的签名。
所以当你一开始连接一个网页的时候,你就信任了这个盒子,因为你相信 Ted,然后 Ted 告诉你这个盒子是可信的。

盒子是很重的

Alice 和 Bob 现在有了一个可以信赖的系统用来通信,但是他们意识到了,让信鸽带着一个盒子飞行相对于只带着信来说实在是太慢了。
所以他们决定他们只会用盒子通信(非对称加密)来决定接下来该用哪种加密方式(对称加密)来加密信封。
这样的话他们就能够各取其长。非对称式加密的可信赖与对称式加密的高效率。
当然在现实世界中不是用缓慢的信鸽来通信,不过用非对称式加密来加密信息始终还是比对称式加密要慢的,所以我们只使用它来交换编码密钥。
现在你已经知道 HTTPS 是如何工作的了,你的咖啡估计也已经好了。好好享用吧你受之无愧。

你可能感兴趣的:(学习资源,经验分享,json,html5,javascript,firefox)