baida.dev
密码学可能是一门很难理解的学科。它充满了数学证明。但除非你真的在开发加密系统,否则很多复杂内容对于理解其高层原理来说并不是必需的。
如果你打开这篇文章是希望创造出下一个 HTTPS 协议,那我很抱歉地告诉你:光靠信鸽是不够的。否则,请泡一杯咖啡,享受这篇文章吧!
爱丽丝、鲍勃……还有信鸽?
你在互联网上做的任何事情(阅读本文、在亚马逊购物、上传猫咪照片)归根结底都是向服务器发送和接收消息。
这听起来有点抽象,所以让我们想象一下:这些消息是由信鸽来传递的。我知道这看起来很随意,但相信我,HTTPS 的工作原理其实也差不多,只是速度快得多。
此外,我们不会讨论“服务器”、“客户端”和“黑客”,而是用爱丽丝(Alice)、鲍勃(Bob)和马洛里(Mallory)来代替。如果你不是第一次接触密码学概念,你可能会认出这些名字——它们在技术文献中被广泛使用。
第一次天真的通信
如果爱丽丝想给鲍勃发一条消息,她会把消息绑在信鸽的腿上,然后放飞给鲍勃。鲍勃收到消息后读取内容,一切顺利。
但如果马洛里在途中截获了爱丽丝的信鸽,并篡改了消息呢?鲍勃将无法知道这条消息在传输过程中已被修改。
这就是 HTTP 的工作方式。是不是挺吓人的?我可不会通过 HTTP 发送我的银行凭证,你也不该这么做。
一种秘密编码
现在,假设爱丽丝和鲍勃非常聪明。他们约定使用一种秘密编码来书写消息:每个字母在字母表中向前移动 3 位。例如,D → A,E → B,F → C。那么明文消息 “secret message” 就会被编码为 “pbzobq jbppxdb”。
现在,即使马洛里截获了信鸽,她也无法理解消息内容,更无法将其改成有意义的内容,因为她不知道这个编码规则。而鲍勃只需反向应用这个规则(A → D,B → E,C → F),就能将密文 “pbzobq jbppxdb” 解密回 “secret message”。
成功!
这被称为对称密钥加密(symmetric key cryptography),因为只要你掌握了加密方法,也就自然知道如何解密。
上面描述的编码通常被称为凯撒密码(Caesar cipher)。在现实生活中,我们会使用更复杂、更高级的加密算法,但核心思想是一样的。
密钥怎么定?
对称密钥加密非常安全,前提是除了发送方和接收方之外,没有人知道所使用的密钥。在凯撒密码中,密钥就是每个字母偏移的位数。在我们的例子中用了偏移量 3,但也可以用 4 或 12。
问题在于:如果爱丽丝和鲍勃在开始通信前从未见过面,他们就无法安全地协商一个密钥。如果他们在消息中直接发送密钥,马洛里就会截获并得知密钥,从而能够随意读取或篡改之后的所有消息。
这就是典型的中间人攻击(Man-in-the-Middle Attack),要避免这种情况,就必须彻底改变加密机制。
信鸽携带箱子
于是,爱丽丝和鲍勃想出了一个更好的办法。当鲍勃想给爱丽丝发消息时,他们会按以下步骤操作:
- 鲍勃先派一只不带消息的信鸽飞给爱丽丝。
- 爱丽丝把一只开着锁的箱子绑在信鸽腿上送回去,但她自己保留钥匙。
- 鲍勃把消息放进箱子,锁上锁,再让信鸽把箱子送回给爱丽丝。
- 爱丽丝收到箱子后,用自己的钥匙打开,读取消息。
这样一来,即使马洛里截获了信鸽,她也无法篡改消息,因为她没有钥匙。当爱丽丝想给鲍勃发消息时,也采用同样的流程。
爱丽丝和鲍勃刚刚使用的就是所谓的非对称密钥加密(asymmetric key cryptography)。之所以叫“非对称”,是因为即使你能加密消息(锁上箱子),也无法解密它(打不开已上锁的箱子)。在技术术语中,这个“箱子”被称为公钥(public key),而打开它的“钥匙”则被称为私钥(private key)。
我怎么信任这个箱子?
如果你仔细思考,可能会发现我们仍然存在一个问题:当鲍勃收到那个开着的箱子时,他怎么确定这真的是爱丽丝寄来的?万一马洛里中途截获信鸽,换成了她自己有钥匙的箱子呢?
于是,爱丽丝决定在箱子上签名。这样,当鲍勃收到箱子时,他可以检查签名,确认确实是爱丽丝寄出的。
但你可能会问:鲍勃怎么识别爱丽丝的签名呢?这是个好问题。爱丽丝和鲍勃也遇到了同样的难题,于是他们决定:不是由爱丽丝签名,而是由泰德(Ted)来签名。
泰德是谁?泰德是个非常著名、广为人知且值得信赖的人。他把自己的签名分发给了所有人,大家都相信他只会为合法的人签名。
只有当泰德确认请求签名的人确实是爱丽丝本人时,他才会为她的箱子签名。因此,马洛里无法冒充爱丽丝让泰德签名——因为泰德会验证身份。当鲍勃收到箱子时,如果看到泰德的签名,就知道这个箱子是可信的;如果是假的,泰德根本不会签。
在技术术语中,泰德就是所谓的“证书颁发机构”(Certification Authority,简称 CA)。你正在用来阅读本文的浏览器,本身就内置了多个受信任的证书颁发机构的签名。
因此,当你第一次连接某个网站时,你会信任它的“箱子”(即公钥),因为你信任泰德(CA),而泰德已经验证并签署了这个网站的身份。
箱子太重了
现在,爱丽丝和鲍勃有了一个可靠的通信系统。但他们意识到:携带箱子的信鸽比只带纸条的信鸽慢多了。
于是他们决定:只用“箱子方法”(非对称加密)。一旦密钥安全交换完成,后续所有通信都用对称加密(比如前面提到的凯撒密码)来加密消息。
这样,他们就兼顾了两种加密方式的优点:非对称加密的安全性,以及对称加密的高效性。
在现实世界中虽然没有“慢信鸽”,但事实确实如此——使用非对称加密加密消息比对称加密慢得多,所以我们只用它来交换加密密钥。
现在,你已经明白 HTTPS 是如何工作的了。