用信鸽解释 HTTPS
密码学是一个难以理解的主题。它充满了数学证明。但除非你自己是开发加密系统的,理解高抽象层次的概念并不需要深入到复杂的细节中。
如果你打开这篇文章是想要开发下一代的 HTTPS 协议,那么很抱歉信鸽不能满足你的需求。如果不是,那么去煮一杯咖啡,然后开始享受文章吧。
Alice, Bob 和 ... 鸽子
你在互联网上的任何活动(阅读这篇文章,在亚马逊上购物,上传猫咪的照片)都需要和服务器交互,进行信息的发送和接收。
上面的描述可能有点抽象,我们可以想象这些信息都是通过信鸽来传递的。我知道这个类比有点太随意了,但相信我 HTTPS 的工作原理是类似的,尽管会快很多。
同样,我们也不谈论服务器、客户端和黑客,而是谈论 Alice, Bob 和 Mallory。如果你不是第一次尝试理解密码学的概念,你应该能认出这些名字,因为他们在技术文献中被广泛使用。
最初的天真的通信方式
如果 Alice 想要发信息给 Bob,她会把信息绑在鸽子的腿上然后发送给 Bob。Bob 收到后就可以阅读信息,一切都很好。
但如果 Mallory 在空中拦截了 Alice 的信鸽,并且修改了信息会怎样?Bob 没有办法知道 Alice 发送的信息在中途被篡改了。
这正是 HTTP 的工作方式。非常可怕对吧?我不会通过 HTTP 发送银行卡信息,你同样也不应该。
一种隐蔽的编码
现在假设 Alice 和 Bob 都非常狡猾。他们商定用一种隐蔽的编码来写信息。他们会将每个字母按照字母表顺移三个位置。比如 D → A, E → B, F → C。普通的文本信息 “secret message” 会变成 “pbzobq jbppxdb”。
现在如果 Mallory 拦截了信鸽,她就不能够修改信息并且还能保持文本有意义,也不理解文本的涵义,因为她不知道编码的规则。但 Bob 却可以反向应用编码规则,通过 A → D, B → E, C → F 的方式破译信息。加密的文本 “pbzobq jbppxdb” 会被破译回 “secret message”。
成功!
这就是所谓的对称密钥加密,因为你知道如何加密信息同时也知道如何解密信息。
我上面描述的编码方式就是通常所谓的凯撒密码。在现实中,我们会使用更复杂的编码方式,但大体思路是相似的。
我们如何商定这个密钥?
对称密钥加密是非常安全的,但前提是除了发送者和接受者其他人都不知道被使用的密钥。凯撒密码中,密钥是每个字母顺移的位数。我们的例子中,顺移了 3 位,但我们也可以使用 4 位或者 12 位等等。
问题在于,Alice 和 Bob 在用信鸽传递信息之前并没有见面,他们没有办法安全地商定一个密钥。如果他们在信息中附带了密钥,那么 Mallory 拦截信息后就能得到这个密钥。这样无论 Alice 和 Bob 加密信息之前还是之后, Mallory 都可以随心所欲阅读和修改信息。
这就是典型的中间人攻击,避免这种攻击的唯一办法就是完全修改加密系统。
鸽子携带盒子
所以 Alice 和 Bob 想到了一个更好的系统。当 Bob 想要发信息给 Alice 的时候,她需要遵守下面的流程:
- Bob 发送一只鸽子给 Alice,但并不携带任何信息
- Alice 发送回这只鸽子,但带了一个已开锁的盒子,她自己保留了钥匙
- Bob 把信息放到盒子里,并且锁上,然后发送给 Alice
- Alice 收到盒子,用钥匙打开,然后阅读信息
通过这种方式 Mallory 没办法通过拦截信鸽来修改信息,因为她并没有钥匙。当 Alice 想要发送信息给 Bob 会遵守同样的流程。
我能信任这个盒子吗?
如果你集中注意力你可能已经发现,我们仍然有个问题。当 Bob 收到一个打开的盒子的时候,他如何能确定盒子来自于 Alice,而不是 Mallory,因为她可以拦截信鸽并且替换成她拥有钥匙的盒子。
Alice 决定她会给盒子签名,这样当 Bob 收到盒子后,他可以检查签名然后知道它是来自于 Alice 发送的盒子。
你们有些人可能会疑惑,最初的时候 Bob 是如何认出 Alice 的签名的呢?好问题。Alice 和 Bob 的确有这个问题,所以他们决定,让 Ted 来签名这个盒子,而不是 Alice 来签。
Ted 是谁呢?Ted 是一个非常知名且值得信任的人。Ted 可以给每个人都签名,每个人都信任他只会给合法的人签名盒子。
如果向 Ted 请求签名的是 Alice,那么他只会签名 Alice 的盒子。所以 Mallory 她自己没办法从 Ted 得到 Alice 的签名盒子。因此 Bob 就可以知道盒子是否是伪造的,因为 Ted 只会给确认了身份的人签名盒子。
Ted 如果用技术术语来描述,就是通常所说的证书颁发机构(Certification Authority),并且你正在使用的浏览器打包了各种 CA 机构的签名。
所以当你第一次连接一个网站,你相信它的盒子,是因为你相信 Ted,Ted 告诉你这个盒子是合法的。
盒子太重了
Alice 和 Bob 现在有了可靠的通信系统,但他们发现信鸽携带一个盒子比只携带信息要慢很多。
他们决定,他们只用这个盒子(非对称加密)来传递一个密钥,然后再用这个密钥对信息进行对称加密(还记得凯撒密码吗)。
这样他们就做到了鱼和熊掌兼得。非对称加密的可靠性以及对称加密的高效率。
在现实世界中,并没有飞得慢的鸽子,不过非对称加密信息要比对称加密慢很多,所以我们仅仅用它作为交换加密密钥的方式。
现在你知道 HTTPS 是如何工作的了,你的咖啡应该也可以喝了。赶紧去喝吧你值得拥有 😉。