https原理介绍
文章作于2023年3月31日。
前言
https,是个老生常谈的词了。今天刷到一个讲的不错的视频,下午闲来无事登上服务器的时候又想到了ssh的原理,遂又复习整理了一番。介于网络上没有太过通俗的文章讲述这个事情,下面我试图使用通俗易懂的“人话”介绍什么是https,以及其原理,不具备严谨性。
https
是什么
https,就是http secure的缩写,代表“安全的http”协议。
当我们在导航栏中输入一段连接,访问一个网址的时候,从请求到响应的过程中,光速级别的数据流横跨全球,跨越千山万水把数据输送到我们的电脑中。在这个过程中,我们需要的数据跨越了成千上万个服务器节点——这些节点的安全性就引发了问题。一些不法分子可以通过截获某个节点的数据,查看其中的内容,直接的暴露了我们的数据隐私,更有甚者,早期的商业垄断者通过篡改数据信息在获取的网页中嵌入广告等信息,甚至篡改这些明文信息。这就产生了数据加密技术,我们所说的https就是其中之一。
非对称加密和对称加密
数据加密技术拥有一对密钥:公钥(public key)和私钥(private key)。经过公钥加密过的数据可以并且只可以通过私钥来破解,反过来也成立:他们既是锁,又是钥匙。唯一不同的就是字如其名,前者可以暴露给所有人,后者只有数据发送源才可以持有。这种不同被起了一个名字,叫做“非对称加密”。
与之对应的是对称加密。它拥有两个完全相同的密钥A和B,经过A(B)加密过的数据可以通过B(A)来解密。在通信中,我们的浏览器和远程的服务器一开始就都持有一个一模一样的密钥,这个密钥只有他们两个有,外人不知道,就实现了加密通话:只有A和B双方能解密经过对方加密过的数据,只有他们两个持有“钥匙”。
在我们第一次访问一个网站的时候,是采用对称加密还是非对称加密呢?显然是非对称加密。对称加密要求通话的双方都持有一个相同的密钥——这是第一次连接所不具备的。
我们来详细的解析一下第一次连接的过程,在此之前,我们需要明白,下面说的公钥和私钥全部都是数据发送源(即被请求的网站那方)生成的。另外,为了便于理解,我们可以把下面过程中的公钥想象成一个带锁的、打开状态的箱子,私钥想象成这个箱子的钥匙。
- 在浏览器中输入一串连接,请求某个网站。
- 网站收到了请求后,响应内容,内容中只包含一个公钥(只邮递了一个箱子过去)。这个过程不造成任何数据泄漏——公钥本来就是暴露的。
- 浏览器收到公钥(箱子)后,随机的生成一段字符串,并且用公钥进行加密(把这个箱子中放了一段字符串,并把它锁上),并返回给网站。可以发现,这个过程也不会造成数据泄漏——箱子被锁上了,没有人能打开。
- 网站收到了箱子后,用自己的私钥打开,得到了用户端准备好的字符串——我们可以发现,这个字符串只有收发方两个人知道——这就是使用对称加密的前提!
- 收发方开始通过对称加密进行通话。
可以发现,实际上,我们也只是在第一次连接的过程中使用了非对称加密。而在连接成功建立后,继续使用对称加密通话。对称加密效率高,更加稳定,所以适用于长期连接。
总结一下,虽然每个主机都可以产生密钥对,但是只有想要分发数据的那一方产生公钥和密钥,并将带锁的、打开状态的箱子(公钥)分发出去。想要和分发数据的数据源主机交互,只需要拿到这个箱子,并把自己的唯一凭证放进去锁上,丢给网站方就可以了。
https的出现
上面的最后一句话实际上还有一个致命的问题:我们在拿到这个网站的“箱子”的过程中,如何确定这个箱子一定就是要请求的网站给的?有没有一种可能,我们获取的公钥被中间人偷偷换掉?这是有可能的。不法分子在我们请求箱子的过程中偷偷换成了自己的箱子(也就是换掉了公钥),我们把自己的信息锁进去,原路返回过程中又被拦截下来,不法分子此时完全可以看箱子里的内容:这个箱子的钥匙在他手里。它打开箱子,取出内容并记下来,再把内容放到原网站提供的箱子里,锁上,返回给原网站:整个过程下来,没有人发现中间人的存在!
要是我们可以一眼就看出这个箱子到底是谁的就好了。这就是https的使命——为每一个箱子(公钥)提供唯一的标识符,避免狸猫换太子。
https的原理与CA机构
先明确目的,我们的目的是让用户端正确的获取到网站的公钥,也就是能一眼看出这个箱子的真假,也就是说这个箱子有绝对正确的唯一凭证。
我们暂时把目光转移到公钥和密钥的特点上。公钥是公开的,密钥是私密的,只有内容分发者A拥有密钥,而所有人都知道这个人的公钥。我们可以发现这对应一个巧妙的现象:经过公钥加密过的数据,只有内容分发者A可以解密,这很好;经过私钥加密过的数据,所有人都可以进行解密——这似乎没什么意义,因为既然所有人都可以查看,加密就显得可有可无了——但这正是巧妙之处所在。我们可以发现,经过密钥加密过的数据,任何人都可以读,却不可以改:这就够作为传输过程中的唯一凭证了!
那我们怎么为我们的公钥箱子贴上这个唯一凭证呢?是的,把这个公钥用私钥加密一遍。用谁的私钥呢?如果用自己的私钥,就产生悖论了:网站的请求方(也就是用户端)本来就没有网站的公钥,也无法获取到(别忘了,我们的目的就是要让用户端正确的获取到网站的公钥)。这个时候,就需要CA机构了。
用户端内置的有一批公钥。这批公钥对应的密钥,就在CA机构里。这些机构将自己的密钥加密我们的公钥,相当于给公钥盖了一个章。我们以后就用这个盖了章的公钥即可。想象我们把它丢给客户端,这个过程中做到了公钥只可读,不可改。客户端拿到了盖章的公钥,并用内置电脑里的公钥解密,取出了公钥。于是,非对称加密的最后一个漏洞就被弥补了:我们拿到的公钥箱子,一定就是网站提供的箱子。
尾声:去中心化
到这里,https的基本原理就讲完了。回顾下来,我们传输数据的安全讨论点,从对称加密转移到非对称加密,又到了CA机构上。而且,每一个前者总依赖后者:对称加密需要非对称加密建立安全的通信,而非对称加密又依赖于https,即CA机构的密钥加密。
我们已经知道,经过密钥加密过的数据,任何人都可以读,但不可以改。这似乎有点儿不够准确:没错,生成密钥的那个人可以改其中的数据。这个人不就是CA机构吗——是的,CA机构,而且很多都是那些在互联网行业中拥有举足轻重地位的大厂。那么他们真的值得信任吗?我们耗费了那么多功夫,把最终的安全性托付给了CA机构。CA机构真的安全吗?
答案肯定是不安全的。首先是技术上的问题,把密钥放在CA机构,意味着CA机构成为整个互联网不法分子的首要攻击目标。但是,这并不是主要的问题,技术上,大厂作为领跑者没那么容易被攻陷。
最主要的问题是人心。CA机构中的工作人员如果受到贿赂——修改加密过的数据易如反掌。历史上已经有过很多类似的丑闻了。这是对人性底线的挑战,是最不确定性的因素。
区块链技术给人们带来的最大的启示就是,任何中心化的节点都是不可信任的。只有将信任分配到每个利益相关方的手中,相互监督才能打破困境。