我用一个小故事来讲讲我自己对HTTPS加密过程的理解吧。
话说孙悟空大闹天宫被佛祖压到五行山下后,佛祖回到大雷音寺,召降龙、伏虎两位罗汉和众弟子前来商讨后续事宜。
佛祖说道,这猴子我倒是把他压到山下了,他虽性格顽皮,却也有些神通,调教调教,还是可堪大用的。我目前的安排是磨砺他500年,让他养养性子。等时候到了,放他出来,我们佛教在人间的宣传事宜就靠他了,金蝉子最后会转世成一个手无缚鸡之力的唐三藏,怎么说也得有个保镖啊。
降龙说道,对对对,而且孙悟空跟玉帝那边闹得那么僵,我们正好可以收为己用,我们跟道教这两大巨头,他迟早得选一边站队。
佛祖接着说道,可是我现在还有个事没想好,所以特意把你们几个叫过来商量商量。就是我关孙猴子的时候吧,给五行山设了个口令密码,叫做“唵嘛呢叭咪吽”。到时候唐三藏走到山的跟前,把这个口令密码念出来,五行山的封印就会解除,猴子就能自己出来了。
伏虎说,这不挺好的吗?
佛祖说道,现在问题的关键是,我应该怎么把这个口令密码告诉唐三藏呢?
伏虎心直口快:这有啥难的,我到时候跑一趟腿,去凡间一趟告诉他不就行了吗?
降龙摇了摇头,不行,现在不比以前了,这两年我们和道教的竞争愈发白热化,各方面都要争个高低。三藏解救悟空这事一定会登上那天的仙界热搜榜,到时候如果道教那帮人知道我们居然还在用跑腿的方法跟凡间通信,简直会笑掉大牙!
伏虎点了点头,说道,是啊,跑腿在这个时代确实有点low了,那咋整啊,总不能找个纸条写上“唵嘛呢叭咪吽”然后贴山上吧,这不是傻子才干的事嘛!
突然佛祖咳嗽了一声,伏虎瞅见佛祖满脸不悦,也不知道自己哪句话说错了,赶紧闭上了嘴。
佛祖说道,山上贴条这事确实不能干了,孙悟空现在在妖界还有不少关系,有大批他的拥趸想着救他出去呢。口令密码就这样堂而皇之的公开,万一被他们救了,岂不是很没面子?
降龙说,那要不我直接用千里传音术告诉三藏吧。
伏虎问,千里传音容易被他旁边的人听到啊,这样会泄密的。
降龙摇了摇头,不会,现在千里传音早就规范化了。为避免混乱,整个仙界目前都在用同一种规则来进行传音,这个规则指定了接收方,以及发出请求和期待回应的类型,这样的话三藏就会知道我是发给他的,而且别人不会收到。这套规则还有个洋气的名字叫做HTTP协议。
佛祖问道,虽说别人不会收到,但抵不住有心之人窃听啊,所谓隔墙有耳。一旦玉帝那边的顺风耳发现你在用HTTP给三藏千里传音,他们仔细听听,就会知道口令密码是唵嘛呢叭咪吽。这种明文传输太不保密了。
伏虎说,是啊,那要不我们给这段密码加密一下吧,我知道一个加密系统,叫做对称加密。用一串密钥可以把任意文字都加密成一堆神秘字符,谁也看不懂这串字符啥意思,只有用同样的一串密钥才能把这堆神秘字符解密出来,变成“唵嘛呢叭咪吽”。我们千里传音可以传这堆神秘字符,就算被顺风耳听见了,他也不知道啥意思。
伏虎的对称加密方案
降龙接过话来说道,顺风耳是看不明白,可三藏也看不明白啊。我们还得把这串解密用的密钥“伏虎”,也告诉三藏,这个过程也可能被顺风耳截获,他也会知道密钥是“伏虎”了,他也就能解密了。
佛祖叹气道,是啊,这样还是不保险。怎么样才能保证千里传音的内容不被玉帝那边的人解密呢?
伏虎灵光一闪,说道,我们可以让三藏准备两串密钥啊!一串公开的用来加密,就叫他三藏公钥吧,任别人截获,无所谓。解密的时候却用另一串私有的,叫做三藏私钥,让三藏自己藏好,也就是说,用三藏公钥加密的内容只能用三藏私钥解密。这样的话,我们可以先跟三藏要过来他的公钥,然后用三藏公钥加密,这个过程被顺风耳听到也没关系,因为他没有三藏私钥,他是解不开的,哈哈!
伏虎的非对称加密方案
降龙说道,说的这么玄乎,这不就是非对称加密系统嘛。我要纠正你一个错误,非对称加密系统里,并不是说公钥就是用来加密的,私钥就是用来解密的。而是他俩都可以进行加密解密的操作,但是公钥加密的密文,只能用对应的私钥解密;私钥加密的密文,只能用对应的公钥解密。他俩是一对儿。不过你说的方法听起来确实挺安全的。
佛祖又叹气道,你们啊,naive。你们不会以为玉帝就这点本事吧?我问你,你怎么就知道你收到的公钥是三藏发来的呢?万一你们俩的通信早就引起了玉帝那边的注意,那他在三藏发出公钥后,拦截掉,并替换成自己的公钥,模仿成三藏的信息再发给你呢?
伏虎一拍大腿,是啊,这样的话,我们就在用玉帝的公钥加密了,那人家再把回信拦截,完全可以破解啊。所以目前的问题就是,如何才能证明我们收到的公钥没有被别人篡改过呢?
降龙挠了挠头,说道,看来得引入一个证书机制了,需要证明我们收到的公钥就是三藏的。
伏虎疑惑道,怎么证明?
降龙接着说道,现在的情况是,我们不确定对方是不是三藏,三藏也不确定我们是不是大雷音寺,双方没有信任,所以需要引入一个双方都信任的第三方机构。我们可以建立一个类似公证处的证书签发机构,就叫他“CA”吧。我们和三藏都无条件信任CA,都承认CA签发的证书是有效的,可以证明我是我,他是他。
然后让三藏把自己的名字加公钥发给CA,CA用自己的私钥给三藏发来的内容加密,然后把原文和加密后的内容放到一起,生成一张数字证书。由于CA的私钥只有CA知道,并且CA私钥加密的内容只有CA公钥可解密,那么我们只要拿CA公钥去解密密文,再和原文进行对比,看是否一致,不就知道三藏的公钥有没有被篡改过了吗?
降龙的验证证书方案
伏虎说,但是最后我要拿CA的公钥的解密啊,你怎么保证CA的公钥是真的呢?
降龙回答道,对,这是一个信任链的起点。CA成立的时候,会给自己也颁发一个证书,我们可以叫它“根证书”,里面有CA的公钥。这份根证书特殊在它是自己给自己发的,因此你如果接受了根证书,代表你对这个机构的信任,而确认这份信任,是一劳永逸的事情。你只需要确认这一份根证书是真的,那以后这个机构签发的证书,你都可以用根证书来验证。同理,三藏也可以用CA的公钥来验证我们大雷音寺的证书是不是别人伪造的。
伏虎恍然大悟道,soga,我好像有点明白了。
佛祖此时插话道,嗯,这个证明关系看起来已经十分安全,可以证明三藏的公钥没有被篡改过。有了三藏的公钥,我们就可以与他进行交流通信,而且不怕被顺风耳监听篡改了,因为别人听了也听不懂,被篡改了我们立刻就能发现。但是公钥看起来十分的复杂冗长,有没有一种方法可以把公钥变短一点,比对起来方便一点?
降龙答道,佛祖果然是心有猛虎,细嗅蔷薇。想达到这个要求,我们可以引入哈希算法。哈希算法有三个主要特性:一致性、无冲突和不可逆。
佛祖笑道,哦?仔细讲讲。
降龙接着说道,所谓一致性就是一样长,就是说无论你的内容是什么,用哈希算法加密后生成的密文都是相同长度的。举个例子,无论你要加密的内容是一个字还是一万个字,用哈希算法加密后,生成的密文都是十六个字,看着十分的整齐规整。
哈希算法的一致性
所谓无冲突,就是不会有两个不一样的内容,加密后的密文是一样的,就如世上没有两片相同的树叶一样。当然,如果是同样的内容,那加密后的内容还是一样的。
所谓不可逆,就是你不能解密,你无法通过密文推算出原内容是什么。
伏虎插嘴道,等等,如果不能解密,我怎么知道原文的公钥没有被改过?
佛祖又笑道,你可以拿着公钥用同样的哈希算法加密,看加密后的内容一样不一样不就行了?
对哦,伏虎小声喃喃道,一时没转过弯来。
降龙接着说道,是的,由于哈希算法加密后的密文是比较简短的,像个摘要一样,所以我们称它为“消息摘要”吧。这样的话,那整个验证证书流程就变成了:
降龙的最终验证方案
在我们和三藏通信的时候,我们双方交换证书,然后用CA的公钥验证,就可以证明我是我,他是他,再然后我们就可以安全的进行通信,不怕消息被监听和篡改啦!
佛祖若有所思,说道,这样的话,最终我们跟三藏通信的过程就是这样的:
整个通信的过程
降龙接着说道,对的。由于这样通信比HTTP安全些,所以这个通信的方式被叫做HTTPS。为了安全起见,我们以后就只跟有证书的人进行千里传音,跟没证书的传音可就要多长个心眼了!
访问证书有效的网站
佛祖长舒一口气,安心的跟众弟子说,以后就用这个方式跟凡间交流,散会!
话音刚落,降龙突然站起来喊道,等一下,我这篇文章是首发在公众号“李纳克斯Linux”上的,有感兴趣的老铁欢迎关注一下啊!