1 序言
今天来聊一聊https安全传输原理。
我们先虚构两个人物,一个国内的Zhang,一个米国的Alice。 这俩隔着千山万水,通过网络联系上了, 两个人臭味相投,聊得火热,天南地北,还夹杂着不少隐私的话题。
2 有一种被偷窥的感觉
因为聊了隐私,Zhang突然意识到,通信是明文的,恶意的人可以监听我们通信,打开我们发送的数据包,偷窥我们的隐私。
于是Alice提议:要不使用加密算法,每次传输前用算法加密,对方接收的时候用算法解密,像这样:
这加密和解密算法是公开的,那个密钥是保密的, 只有两人才知道, 这样生成的加密消息(密文) 别人就无法得知了。但是密钥要发给另一个人,因为网络是不安全的,还不能通过网络, 这密钥怎么安全地发过来啊 ?
Zhang沉默了,心想:难不成要专程去趟米国传递密钥,那跟其他朋友联系也得这么来一遭?!
注:这叫对称加密算法, 因为加密和解密用的是同一个密钥。虽然对数据要来一道加密的工序,但加解密速度还可以。
3 RSA : 非对称加密
直到后来,他们知道了RSA的非对称加密算法这个东西。RSA有意思了,它不像之前的算法,相互商量一个密钥,而是有一对密钥,一个是保密的,叫做私钥,一个是公开的,叫做公钥。而且更有意思的是,用私钥加密的数据,只有对应的公钥才能解密,用公钥加密的数据, 只有对应的私钥才能解密。
有了它,Zhang给Alice发消息的时候,就可以用Alice给的公钥(反正是公开的)去加密, 等到消息被 Alice 收到后, 她就可以用自己的私钥去解密(只有Alice才能解开,私钥是保密的 )。反过来也是如此。
这样没有任何人能窥探他们了。
4 非对称加密+对称加密
试了几次后,发现这东西有点慢。
Zhang细想了下,觉得可以用非对称加密+对称加密方法来解决,就给Alice提议:可以先用非对称加密的方式通信,把你的公钥发给我,有了这个公钥,后续我们就用对称加密的方式通信。
5 中间人攻击
热心朋友向Zhang提出了疑问,说:你怎么知道公钥就是 Alice 发过来的公钥,假如有个中间人截获了Alice发的公钥,然后自己冒充Alice伪造出一个公钥发给你,你就会用这个公钥加密发送数据,中间人就可以解密看到你的消息了。
听到这,Zhang背后冒汗,心想:还以为我们在安全传输呢...。
看来问题出现在了公钥的分发上! 虽然这个东西是公开的, 但是别有用心的人截取以后还可以干坏事!
6 你到底是谁?
怎么分发密钥呢?似乎又回到了最初的问题:怎么安全的保护密钥? 但跟最初又不相同,这一次的公钥不用保密,但是一定得有个办法声明这个公钥确实是Alice的, 而不是别人的。
现实中有公证处,它提供的公证材料大家都信任,那在网络世界也可以建立一个这样的具备公信力的认证中心, 这个中心给大家颁发一个证书, 用于证明一个人的身份。
这个证书里除了包含一个人的基本信息之外,还有包括最关键的一环:这个人的公钥(用于数据通信加密)!这样以来我拿到证书就可以安全地取到公钥了 !
证书怎么安全传输? 要是证书传递的过程中被篡改了怎么办?
不过后来Zhang还是找到了突破口数字签名。
简单来讲是这样, Alice可以把她的公钥和个人信息用一个Hash算法生成一个消息摘要, 这个Hash算法有个极好的特性,只要输入数据有一点点变化,那生成的消息摘要就会有巨变,这样就可以防止别人修改原始内容。
可是作为攻击者的中间人笑了: “虽然我没办法改公钥,但是我可以把整个原始信息都替换了, 生成一个新的消息摘要, 你不还是辨别不出来?”
Zhang说你别得意的太早 , 我们会让有公信力的认证中心(简称CA)用它的私钥对消息摘要加密,形成签名:
这还不算, 还把原始信息和数据签名合并, 形成一个全新的东西,叫做“数字证书”
Zhang接着说:当Alice把她的证书发给我的时候, 我就用同样的Hash 算法, 再次生成消息摘要,然后用CA的公钥对数字签名解密, 得到CA创建的消息摘要, 两者一比,就知道有没有人篡改了!
如果没人篡改, 我就可以安全的拿到Alice的公钥,有了公钥, 后序的加密工作就可以开始了。
虽然很费劲, 但是为了防范你们,实在是没办法啊。
中间人说: “算你狠! 等着吧,我还有别的招。 对了,我问你, 你这个CA的公钥怎么拿到?难道不怕我在你传输CA公钥的时候发起中间人攻击吗? 如果我成功的伪装成了CA,你这一套体系彻底玩完。”
Zhang语塞了,折腾了半天,又回到了公钥安全传输的问题!
不过转念一想,想解决鸡生蛋,蛋生鸡的问题必须得打破这个怪圈才行,我必须得信任CA,并且通过安全的的方式获取他们的公钥,这样才能把游戏玩下去。
注:
1 这些CA本身也有证书来证明自己的身份,并且CA的信用是像树一样分级的,像一个证书链,高层的CA给低层的CA做信用背书,而操作系统/浏览器中会内置一些顶层的CA的证书,你会自动信任了他们。 这些顶层的CA证书一定得安全地放入操作系统/浏览器当中,否则世界大乱。
2 数字证书的验证过程
以下图的证书链为场景来简化说明(当然真实的过程会复杂一些)
2.0 Zhang的数字证书由杭州市认证机构签发,杭州市认证机构的数字证书又由上级签发,依此类推,一直到国家这一层。国家认证机构的数字证书可以认为是根证书。Alice的电脑操作系统/浏览器一开始就内置前3个证书。
2.1 当Alice收到Zhang的数字证书,需要验证这个证书,因为证书中的颁发机构是杭州市认证机构,所以在证书链中往上层找到杭州市认证机构的数字证书,借助其公钥对Zhang的数字证书进行验证。
2.2 杭州市认证机构的数字证书又通过其上层验证。
2.3 依此类推...。
2.4 直到根证书结束(因为根证书是自动信任的,所以不需要验证)。
2.5 如果中间某个环节认证不通过,证书验证失败。如果都成功,证书验证成功。
3 为什么可以自动信任顶层的证书?
因为这些顶层的证书是在操作系统/浏览器中预置的,只要电脑安装的操作系统/浏览器安全,预置的证书也是安全的。
7 https
终于可以介绍https了,前面已经介绍了https的原理, 你把Zhang替换成浏览器, 把 Alice 替换成某个网站就行了。
一个简化的https流程图是这样的, 如果你理解了前面的原理,这张图就变得非常简单: