白话HTTPS(下)

0

白话HTTPS(下)

前言

当我们聊到计算机网的时候,脑海中很容易复现大学课堂上说的什么五层 七层模型,每一层有对应各种各样复杂繁多的网络协议,各种算法,很容易让人心生畏惧。可能大家工作后涉及到相关内容,想去恶补网络相关,然后知乎上,豆瓣上各种大牛会给你推荐一系列金色字体 黑色封面 机械工业出版社的书籍。

file

非常大部头,很容让人望而止步,翻几页就从入门到放弃了。而且这些书籍也很容易给人一种心理预期:网络协议都是一些枯燥难懂的东西。

其实不是的啊,这两期HTTPS相关的分享,其实也是抛砖引玉,想告诉大家,网络协议这块从解决问题的角度入手,结合实际的用户场景,很多复杂的问题可以从很简单的角度去理解。至少这两期分享,只要需要大家有高中程度的数学知识,和一些常见的生活常识就能够听得明明白白的了。

上期回顾

废话不多说,回顾一下我们上一期内容讲了些啥? 我们上一期由域名劫持的问题引入,讲解了DNS流程,了解了为什么HTTP不安全。然后开始了我们的正文,HTTPS是如何实现数据安全的。我们复习下这个数据安全。

什么是数据安全?

安全的数据需要同时具备了机密性、完整性、身份认证、不可否认这四个特性。

1、机密性

2、完整性

3、身份认证

4、不可否认(Undeniable)

这个数据安全的定义需要补充说明下,这四个特性第一次听的话感觉有点官腔不贴地气,也不容易记住。有点像背高中课文。

我们想下为什么是这四个特性呢?少了哪个多了哪个是不是可以呢?其实不可以的哈,其实这四个特性恰好描述了一次安全通信的所有必要条件。

举个例子:

假如马云找我借200块钱

第一,借钱毕竟不是什么光彩的事情,我们的对话不能让别人知道,需要机密性。

第二,对话的内容是马云向我借200块钱,不能变成马云向我借20块钱,也不能变成马云向我借2000块钱,更不能变成我向马云借200块钱。数据不能多不能少,也不能有变更。这是第二点的数据完整性。

第三,我们把借钱这个事确定了,石锤了,确确实是管我借两百块钱,完了我要把钱给马云,那我肯定得确认下马云是本人,得确认马云不是别人假扮的,当然,从另一个角度看,马云要是有底线的话,也不是有人给钱就接,君子不受嗟来之食,他得确认是我是我, 是我的钱才拿。这是第三点的身份认证。

第四,我把钱借出去,时间到了当然也要把钱要回来,有借有还再借不难。假如我去找马云还钱,云说:“我没有,我不是,你记错了吧??”,这当然不行,口说无凭,我需要把云说的话,和说这句话的主体绑定起来,让马云不可否认,为了做到这样子可能我把钱借出去的时让马云写个借条,签个名摁个手印,这样子有凭有据,马云就undeniable了,这是第四点特性,不可否认。

至此整个流程结束,从借钱这个例子可以看出,这四个特性确确实实把这次通信可能存在的安全漏洞都考虑到了,这四个特性也是非常合理必要的。

基于第一个特性机密性,我们上期讲解了对称加密和非对称加密,那么数据的完整性要怎么保证呢?下面我们就来讲数据的完整性

正文

1 完整性

不知道大家以前有没有看过鉴宝节目,我小时候挺喜欢看的,因为这个节目里经常有普通老百姓把家里的一些看起来不起眼的花瓶瓷碗,瓶瓶罐罐啥的拿给专家鉴定,完了专家一看这个可能是唐代或者宋代啥的名贵古董价值几十万甚至几百万,当时这个节目效果对于一个家境贫寒的小朋友来说还是很震撼的,开始反思家里有啥能算是古董的东西,唐代还是宋代不重要,主要就是想一夜暴富,结果除了了冰箱电视洗衣机啥的家用电器有点历史之外,其他瓶瓶罐罐、锅碗瓢盆啥的还是挺新的。

虽然暴富的梦想破灭了,不过我注意到这个节目里边有个细节,专家出了看宝贝的品相成色之外,很经常会把宝贝放在耳朵边敲打一下,然后听古董被敲打后的声音,完了专家就可以得到 宝贝是正品还是赝品,是什么材质,是否损坏是否经过二次修复等等的信息,不懂原理的情况感觉还是有点神奇。

其实原理是不同材质、不同结构的物体所会展现的其独有音色,这里主要是指瓷器或者玉石类的古玩,有经验的专家通过音色,浑浊和清脆的程度,是否有杂音等信息 就可以对收藏的宝贝进行鉴定,告诉你你的传家宝到底是 路边摆摊十块钱三件的地摊货,还是正儿八经的古董。

在这里音色有几个特性

1.1反映物体的独特性

音色可以看做一个物体独一无二的指纹, 不同材质、不同结构的物体所会展现的其独有音色,能反馈宝贝的身份信息,即使同一个年代,同一个产地,同一个产线,生产的宝贝由于设备、人工、环境等误差,所以生产的宝贝也会存在差别,所以产生的音色也不一样。与此同理,我们平时水果摊买西瓜前也会拍打下西瓜听听声音感觉熟不熟也是利用这个原理,虽然绝大多数人都是瞎拍几下然后挑个顺眼的买走。此外,我们人的声音也是具有独特性的,我们现在的声纹解锁也是这么个原理。

1.2 反映整体性

不同材质,不同结构的宝贝,或者宝贝磕了碰了,修补过都会导致音色的变化,所以经验丰富的专家通过音色就能见微知著得知物体的整体信息。

1.3 信息简要

在这里,音色相当于宝贝信息的浓缩,为了验证以上信息我们不用把宝贝掰开了揉碎了一粒粒一点点挨个检测。音色这一信息,相对于整个收藏品来说,信息是很简短的,也容易验证,轻轻敲下听个响就行。

那我们有没有办法给我们的计算机数据生成一个类似音色或者类似指纹的东西呢?答案当然是可以。实现方式是就是用摘要算法生成一个数据摘要。

1.4 摘要算法(哈希算法,散列算法)

我们平时说的摘要算法、哈希算法、或者散列算法其实是同一个东西,哈希 是对 hash 的音译 ,摘要和散列是hash 的意译。我们这里就统称为哈希算法吧。

根据维基百科的定义

(在维基百科里面哈希算法会被重定向到散列算法) 散列算法(英语:Hash function)又称散列算法、哈希函数,是一种从任何一种数据中创建小的数字“指纹”的方法。散列函数把消息或数据压缩成摘要,使得数据量变小,将数据的格式固定下来。该函数将数据打乱混合,重新创建一个叫做散列值(hash values,hash codes,hash sums,或hashes)的指纹。

这个定义听起来有点绕,通俗地讲就是将任意长度的数据,通过算法,生成指定长度的数据(摘要)。

其实我们说到哈希算法,散列算法大家不一定熟悉,但是说到 MD5 SHA 算法,大家应该就很眼熟了,因为大家很经常需要用这两种算法来进行文件校验,检测文件在传输过程中是否损坏。他们的原理就是比如文件传输前后生成的摘要是否一致,如果传输过程数据损坏了那么摘要也会相应发生变化。

一个优秀的哈希算法有三个特点

1、单向性

只能从输入求输出,不能从输出求输入。

2、抵抗冲突

3、雪崩效应

(wiki百科)在密码学中,雪崩效应(avalanche effect)指加密算法(尤其是块密码和加密散列函数)的一种理想属性。雪崩效应是指当输入发生最微小的改变(例如,反转一个二进制位)时,也会导致输出的不可区分性改变(输出中每个二进制位有50%的概率发生反转)。

通过摘要算法我们就可以校验数据的完整性。

2、不可否认(Undeniable)和 身份认证

(由于不可否认涉及到的知识为身份认证提供了理论基础,所以我们这里先讲不可否认。)

哈希算法,我们保证了数据的完整性,可以确保数据没有被更改过了。

基于前面讲的例子,坚哥说管我借两百块钱,这句话没问题,那么要如何保证这句话是坚哥说的呢?

在现实生活中的处理手段是借钱放写个欠条,签个名嗯个手印。在计算机领域用到的技术就是数字签名。

2.1 数字签名

大家有没有想过,为什么打欠条签个名字嗯个手印就具备法律效应了呢?

原因其实大家都懂,因为你的签名和指纹只有你有,通过签名和指纹能找到对应的人。

那么在计算机的世界里边。大家都是冷冰冰的数据,,用数据的角度思考,什么东西是只有你有大家没有的呢?

不知道大家还记得上期讲的非对称加密通信模型吗,这里的答案就是私钥。

file

在这上面流程中公钥是可以在网络中传输的,让对方和自己发消息加密用得,而私钥只有自己知道自己保存,自己解读别人发送给自己的加密信息用的,并不用传输,

如果大家理解了前面讲的 非对称加密 和 哈希的原理。理解数字签名的原理就会很容易。

数字签名实际是非对称加密和哈希算法的综合应用。

file

数字签名分为 签名和验签两个过程,其实也很好理解

签名对应1 2

验签对应3 4 5

因为用你的私钥签的名,完了反过来用你的公钥解得密,比对这前后过程中得出的摘要就可以看出数据是否发生变化。

2.2 身份认证

在讲身份认证之前,先给大家看一段视频。

看完视频后,我想请大家思考一个问题,“我是谁?”

file

我们正常普通人不像龙妈有那么多头衔,一般会直接回答名字。

但是单单讲名字还不够哈,因为难说世界上有多少同名的人。一般我们被警察上门查水表,是直接检查我们的身份证。

其实我想说的是这个。

不着急讲数字证书,我们看下我们的身份证上都写啥。

file

file

地址民族啥的不是特别重要,主要是

名字,身份证的持有人

身份证号码,可以理解为人的数据摘要,独一无二。

签发机构,证明这张身份证合法的机构。

有效期。

我们再来看看window上的证书里面包含哪些内容(cmd运行certmgr.msc)

file

file
可以看到数字证书除了秘钥,其他的信息都和都是和身份证差不多,他们俩本质上是同一个东西,都是证明人或者数据合法性的。

数字证书本质上是一个数字签名,前面我在讲非对称加密的时候,一直在规避一个问题不知道大家有没有发现

就是非对称加密的公钥派发的问题。前面非对称加密通信模型中,要跟别人进行通信,要用别人的公钥进行加密。

那我们要怎么确定别人的公钥没问题呢?

答案就是用前面提到,数字签名。我们用数字签名把证书相关的信息和公钥进行签名,生成数字证书。验证流程和上面签名和验签流程一样。通过校验两者前后的摘要

这个个证书就能为这个公钥的有效性背书。

file

2.2 数字证书验证体系

那么问题又来了,前面证书验证公钥流程,其实是在信任证书公钥的基础上。流程谁能保证这个证书的公钥有效呢?可能有人觉得再找个证书为这个证书的公钥背书。那这个证书公钥的合法性呢?

鸡生蛋,蛋生鸡没完没了呀,解决不了先有蛋还是先有鸡。假如现在有一个鸡中的战斗机,鸡界的权威告诉大家,不用在争了世界上先有鸡就是我。这个循环就得到解决,在证书体系中,一级验证一级,验证到最后的就是 “自签名证书”(Self-Signed Certificate)或者“根证书”(Root Certificate),它自己为自己签名,有合法机构为它的合法性和权威性作保障。根证书一般预置在我们的浏览器或者操作系统中。

file

至此我们数据安全的四个特性以及相关原理就都讲完了。

我们串起来回顾下基于TLS1.2 通信过程(图片来源网络,来不及画了)

file

至此整个系列就讲完了,内容难免有些不严谨的地方,还请谅解。