「翻译」用信鸽解释HTTPS

原文地址:HTTPS explained with carrier pigeons

HTTPS是HTTP的安全版,它是如何运作的呢?

提到HTTPS会想到这是一个很难搞懂的概念,因为涉及到复杂的密码学问题。但事实上,如果不是要研发下一代HTTPS的标准,我们并不需要在密码和数学问题上理解太深。我们用信鸽传信就可以理解HTTPS的运行机制。

小红、小明和…信鸽?

我们在互联网上做的事情,无论是阅读文章、在淘宝买东西还是发朋友圈,都无非是发送信息给服务器以及从服务器接收数据。

这样描述会显得很抽象,不如我们用信鸽来打比方。事实上HTTPS做的事和信鸽是一样的,只不过比信鸽的速度快一些而已。

我们也不聊服务器、客户端还有黑客,我们用小红、小明和小刚来代替。

第一次通信

假设小红想要寄一封信给小明,她使用的方法是在她的信鸽的腿上绑上信息,然后让信鸽去找小明。小明收到信之后就可以阅读信的内容了。

但如果小刚暗恋小红,他不想看到这两个人通信,想要偷偷拦截小红的信鸽,悄悄改掉信中的内容呢?小明不会发现小红寄给他的信已经在途中被改过了。

事实上,HTTP就是这种情况,听起来是不是很吓人?所以我们不应该使用HTTP来传递自己的银行账号之类的重要信息。

加上密码

现在我们假设小红和小明学聪明了,他们决定要用密码来写信。他们想到的方法是对照字母表,把他们要写的内容对应的字母都往后挪3个,比如要写A,就用D取代,要写B,就用E取代,以此类推。比如他们想要写“secret message”,写出来的结果就是”pbzobq jbppxdb”。

现在就算小刚劫持了他们的信鸽,他也没法知道信上写的是什么,因为他不知道密码,so sad。但如果是小明收到信,他就能轻易地将信翻译过来,因为D就指的A,E就指的B。这封信写的就是”secret message”。

棒棒哒!

这个方法叫做对称秘钥加密,就是说,如果你知道怎么加密,就知道怎么解密。

这个在字母表上顺移字母的方法叫做凯撒密码。现实生活中,我们会用到更复杂一些的密码,但本质上是一样一样的。

怎么选秘钥?

在旁人不知道秘钥的情况下,对称秘钥加密加密是非常安全的。像凯撒密码,秘钥就是顺移几个字母,小红和小明选的是3个,但他们也可以选4个或者12个。

但问题在于,在如果他们在放鸽子之前不提前碰面确定秘钥,那就没法使用其他安全方法通知对方秘钥是什么了。因为如果他们用信鸽来告诉对方秘钥,小刚就会劫持到这个信息,知道秘钥是什么,之后就能轻松劫持他们的鸽子,偷看他们的信了。

这就是一个典型的中间人攻击的例子,唯一的解决方法是修改整个加密系统。

给鸽子加个盒子

于是小红和小明就想到一个更棒的注意,当他们要通信的时候,就这么来:

  • 小明给小红发送一个没有携带任何信息的鸽子
  • 小红让鸽子载着一个打开的盒子飞到小明家,但是钥匙还在小红自己手里
  • 小明把信放到盒子里,锁上盒子,让鸽子飞回小红家
  • 小红收到盒子,用钥匙打开读信

因为小刚没有钥匙,就没法拦截鸽子、修改信的内容了。等小红要给小明写信的时候,就重复上面的步骤。

小红和小明用的这个方法就是非对称秘钥加密。所谓非对称就是就算你可以加密(锁上盒子),你也没法解密(打开锁着的盒子)。

用术语来说,这个盒子就是公钥,打开盒子的钥匙就是秘钥

盒子可靠吗?

但这样还有一个问题。小明怎么才能确定寄给他的打开的盒子是小红寄来的,而不是小刚把自己的盒子寄来了呢?

小红决定在盒子上签上自己的名字,这样小明就能认出她的签名,从而知道盒子是她寄的了。

但是小明怎么在他们第一次通信的时候就认出小红的签名呢?小红和小明也为这事犯愁。于是他们决定去找王老师签名。

王老师是谁呢?王老师是他们的签名老师,非常可靠,信得过。王老师专门负责签名,而且大家都相信王老师只会给好学生的盒子签名。

王老师只会在小红来找他签名的时候签上小红的名字。如果小刚没法让王老师在自己的盒子上签一个小红的名字,小明就能一眼认出小刚的盒子是假的了。因为王老师只有在确认大家身份的情况下给大家签名。

用术语来解释,王老师就是证书颁发机构,你浏览网页的浏览器通常包含好多证书颁发机构颁发的签名。

当你第一次登录一个网站的时候,能让你相信这个网站是安全网站的原因就是你相信王老师,而且王老师告诉你这个盒子是可靠的。

盒子太重了

小红和小明现在已经有了一个非常安全的通信系统,但是他们觉得让鸽子背着盒子飞实在太慢了,还是让鸽子只负责传信比较好。

他们决定只用盒子(非对称秘钥加密)来决定到底用什么(对称秘钥加密法的)秘钥。

这样他们就能既保证安全,又提高速度了。