一个故事讲完https
本文转载自微信公众号「码农翻身」文章 一个故事讲完https(作者:老刘)。版权归原作者所有,此处仅作个人学习备份。
1. 序言
今天来聊一聊 https 安全传输的原理。
在开始之前,我们来虚构两个人物,一个是位于中国的张大胖,还有一个是位于米国的 Bill。这俩哥们隔着千山万水,通过网络联系上了,两个人臭味相投,聊得火热。两个人越聊越投机,天南地北,海阔天空,还夹杂着不少隐私的话题。
2. 总是有一种被偷看的感觉
有一天,Bill 突然意识到:坏了,我们的通信是明文的,这简直就是网络上裸奔啊,任何一个不怀好意的家伙都可以监听我们通信,打开我们发送的数据包,窥探我们的隐私啊。
Bill 提议:“要不我们做个数据的加密?每次传输之前,你把消息用一个加密算法加密,然后发到我这里以后我再解密,这样别人就无法偷窥了。”
张大胖冰雪聪明,一看就明白了,这加密和解密算法是公开的,那个密钥是保密的,只有两人才知道,这样生成的加密消息(密文)别人就无法得知了。
(注:这叫对称加密算法,因为加密和解密用的是同一个密钥。)
可是问题来了:Bill 要把密钥发给张大胖,如果这个密钥在网络上传输时也被截取了,那加密岂不白费工夫?网络是不安全的,这密钥怎么安全地发过来啊?而且 Bill 的好友遍布全球,他总不能满世界打着飞的去和人当面交换密码吧。
3. RSA:非对称加密
直到有一天,他们听说了一个叫做 RSA 的非对称加密算法,一下子来了灵感。
这个 RSA 算法非常有意思,它不是双方必须协商一个保密的密钥,而是有一对儿钥匙,一个是保密的,称为私钥,另外一个是公开的,称为公钥。
更有意思的是,用私钥加密的数据,只有对应的公钥才能解密;用公钥加密的数据,只有对应的私钥才能解密。
有了这两个漂亮的特性,当张大胖给 Bill 发消息的时候,就可以先用 Bill 的公钥去加密(反正 Bill 的公钥是公开的),等到消息被 Bill 收到后,他就可以用自己的私钥去解密(只有 Bill 才能解开,私钥是保密的)。反过来也是如此。这样以来,通信安全固若金汤。
4. 非对称加密 + 对称加密
两人实验了几次,发现 RSA 的加密和解密有点慢——这个 RSA 算法比之前的对称密钥算法要慢上百倍。
于是想到可以结合一下,分两步走:
- 生成一个对称加密算法的密钥,用 RSA 的方式安全发给对方;
- 随后就不用 RSA 了,只用这个密钥,利用对称加密算法来通信。
这样以来既解决了密钥的传递问题,又解决了 RSA 速度慢的问题。
5. 中间人攻击
张大胖的老婆提醒道:“假如 Bill 给你发公钥的时候,有个中间人截取了 Bill 的公钥,然后把自己的公钥发给了你,冒充 Bill,你发的消息就用中间人的公钥加了密,那中间人不就可以解密看到消息了?”
张大胖背后出汗了,是啊,这个中间人解密以后,还可以用 Bill 的公钥加密,发给 Bill,Bill 和我根本都意识不到,还以为我们在安全传输呢!
看来问题出现在公钥的分发上!虽然这个东西是公开的,但是在别有用心的人看来,截取以后还可以干坏事。
6. 你到底是谁?
怎么安全地分发公钥呢?这一次的公钥不用保密,但是一定得有个办法声明这个公钥确实是 Bill 的,而不是别人的。
现实中有公证处,它提供的公证材料大家都信任,那在网络世界也可以建立一个这样的具备公信力的认证中心(简称 CA),这个中心给大家颁发一个证书,用于证明一个人的身份。这个证书里除了包含一个人的基本信息之外,还包括最关键的一环:这个人的公钥!
可是证书怎么安全传输?要是证书传递的过程中被篡改了怎么办?这就要用到数字签名了。
简单来讲:Bill 可以把他的公钥和个人信息用一个 Hash 算法生成一个消息摘要,这个 Hash 算法有个极好的特性——只要输入数据有一点点变化,那生成的消息摘要就会有巨变,这样就可以防止别人修改原始内容。
但攻击者可以把整个原始信息都替换了,再生成一个新的消息摘要。所以还要让有公信力的认证中心(CA)用它的私钥对消息摘要加密,形成签名;再把原始信息和数字签名合并,形成一个全新的东西,叫做数字证书。
当 Bill 把他的证书发给张大胖时,张大胖就用同样的 Hash 算法再次生成消息摘要,然后用 CA 的公钥对数字签名解密,得到 CA 创建的消息摘要,两者一比,就知道有没有人篡改了。如果没人篡改,就可以安全地拿到 Bill 的公钥了。
那 CA 的公钥怎么拿到?想解决鸡生蛋、蛋生鸡的问题必须打破这个怪圈:我必须得信任 CA,并且通过安全的方式获取他们的公钥。
(注:这些 CA 本身也有证书来证明自己的身份,并且 CA 的信用是像树一样分级的,高层的 CA 给底层的 CA 做信用背书;而操作系统/浏览器中会内置一些顶层的 CA 的证书,相当于你自动信任了他们。这些顶层的 CA 证书一定得安全地放入操作系统/浏览器当中,否则世界大乱。)
7. https
终于可以介绍 https 了。前面已经介绍了 https 的原理,你把张大胖替换成浏览器,把 Bill 替换成某个网站就行了。一个简化的 https 流程(例如没有包含 Pre-Master Secret)如果你理解了前面的原理,就变得非常简单。
(完)