层楼

Write codes that work and speak

0%

【译】用信鸽解释HTTPS

译自:HTTPS explained with carrier pigeons

引言

密码学可能是一个复杂的学科,其中充满了数学证明。如果你不是在开发密码系统,那么其实可以忽略大部分复杂性,从一个更高的视角来理解发生了什么。

如果你看这篇文章是为了创造下一代HTTPS协议,那很遗憾,只有信鸽是不够的。如果不是的话,那就冲一杯茶,享受一下这篇文章吧~

小帅,小美和信鸽?

在互联网上的任何操作(阅读此文、在淘宝上剁手、上传猫猫的照片),都可以归结为和服务器通信,或发送或接收。

这或许有点抽象,所以不妨让我们想象这些消息是由信鸽来派送的。我知道这个比喻有点武断,但是请相信我,HTTPS和这差不多,只是更快一点。

我们会讨论小帅、小美和大壮,而不是服务器、客户端和黑客。如果这不是你第一次尝试理解密码学概念,你会认识到这些名字,因为它们在技术文献中被广泛使用。

第一次通信,too simple,sometimes naive

如果小美想给小帅发消息,她可以把信绑在信鸽的腿上,然后抛飞信鸽,小帅收到信鸽,阅读消息,这世界一切都很美好。

但是如果大壮在鸽子飞行途中给它拽下来,偷偷修改消息,再放它离开。那么小帅就不知道小美写的消息有没有被修改过。

这就是HTTP的工作方式,听起来有点吓人对吧?我反正不会用HTTP发送账号密码的,您请便。

一套密钥

如果小美和小帅是聪明人的话,他们一定会约定用一种加密方式来进行通信。比如说可以把每个字母向后移3个位置,这样消息“secret message”就成了“pbzobq jbppxdb”。

现在,如果大壮拦住信鸽,他也不知道消息写的都是啥,也很难对内容进行有意义的修改,因为他不知道如何加密解密。但是小帅知道,所以他可以对消息进行反向解密,“pbzobq jbppxdb”就变回了“secret message”。

这就成了!

这就是对称加密,如果你知道怎么加密,那你就知道怎么解密。

上文描述的加密方式其实是凯撒密码。在现实生活中,我们使用更复杂的算法,但是其本质都是一样的。

如何决定密钥?

如果通信双方使用的密钥没有泄露的话,那么这种对称加密是很安全的。在凯撒密码中,密钥是我们将每个字母向后移动了多少个位置。在上文中我们用的是3,当然你也可以用4或者12。

现在问题来了,如果小美和小帅在通信之前没有见过面,他们就没办法构建一个安全的密钥。因为如果他们在消息中传递密钥,那么大壮就可以抓住信鸽并且获取密钥,这样他就可以在小美和小帅的通信过程中随意偷看或修改。

这就是所谓的中间人攻击,为了避免这种攻击我们只能换一种加密系统。

鸽子背个盒子

小美和小帅想到了一个更妙的办法。当小帅想给小美发消息时,需要遵循这个流程:

  • 小帅给小美飞一只鸽子,啥都没有
  • 小美收到鸽子,给鸽子上绑一个敞开着的盒子,放飞鸽子
  • 小帅收到鸽子,把信件放进盒子,把盒子锁上,再放飞鸽子
  • 小美收到鸽子,用自己的钥匙打开盒子

这样的话,大壮就不可能通过拦截鸽子来篡改消息,他没有钥匙。当小美给小帅发消息时,遵循同样的流程即可。

这个过程就叫做非对称加密。非对称是指,小帅虽然能够锁上盒子(加密),但是没办法打开盒子(解密)。在技术术语中,这个盒子就是公钥,小美的钥匙就是私钥。

凭啥相信这个盒子?

如果你仔细想想,这里边其实有点问题。小帅收到盒子,凭啥能断定这个盒子就是小美的呢?如果是大壮中途换了一个盒子呢?

所以小美决定给盒子上签个名,这样小帅收到盒子的时候,看看上面的签名,就知道是不是小美的盒子了。

所以你一定会接着问,那小帅凭啥可以断定这就是小美的签名呢?好问题,小帅和小美也意识到这个问题,他们最终决定不让小美签名了,不如改换老龚签名。

老龚又是谁?他是一个非常知名的、值得信赖的人。老龚把自己的签名分发给大家,并且大家都信任他只会给合法的人签名。

老龚只有确认来者是小美时,他才会在盒子上签名。所以大壮没办法伪造一个带有小美签名的盒子,这样也就骗不了小帅了。

在技术术语中,老龚就是认证机构。你现在正在使用的浏览器里,打包安装好了各种认证机构的签名。所以当你访问一个网站时,你信任它的盒子,因为你信任老龚,而且老龚告诉你这个盒子是ok的。

盒子有点沉

小美和小帅现在有了一个优雅可靠的通信系统,但是他们发现背着盒子的鸽子飞的有点慢。

所以他们决定只通过这种方法(非对称加密)来交换密钥,之后鸽子就不需要一直背着盒子啦,使用原来的对称加密就够了,还记得凯撒加密吗?

这样,他们兼容了对称加密的效率,以及非对称加密的可靠。

在现实世界中,鸽子飞的都挺快。不过,非对称加密确实比对称加密慢,所以我们只用它来交换密钥。

现在你已经知道HTTP是怎么工作的了,茶应该泡好了吧?