白话HTTPS的加密机制
在讲主题之前,我们先来区分两个概念:签名和加密有什么区别?
我们从字面意思看:
-
签名就是一个人对文件签署自己的名字,证明这个文件是我写的或者我认可的,所以只要别人看到我的签名,认识我字迹的人就知道这个文件确实是可以信任的,如果文件没有我的签名,或者签名不对,说明文件可能被改动了,是个假的,不可信。在网络安全中,签名的意义是防止文件篡改,只有签名正确的文件才可信。
-
加密就是将一段内容按照一定规则打乱,让不懂规则的人看不懂这段文字内容,而知道规则的人可以将乱序的内容反推出原文来,从而实现了内容在传递过程中不被不相关的人所理解,达到安全的目的。
为什么要讲这两个东西呢?因为这两个概念在HTTPS加密过程中是很重要的概念,他们解决了安全传输中的两个重要问题:
- 保证信息在传输过程中是加密的状态,
- 保证信息不被篡改
正题,HTTPS的加密原理
为了生动的讲述加密过程,我们利用一段角色故事来说明:
故事里有三个角色:分别是小红A,小强B,和小贱C.
小红A代表服务器,小强B代表客户端,小贱C代表中间劫持者。以下用ABC简称。
故事是这样的:小红和小强互相爱慕对方,但是二者离得有点远,只能通过扔纸条的方式把信息传递给对方。而C特别好奇,就老想在中间把纸条拦截下来偷看,显然A和B是不愿意的,所以他们要想出一个办法,既要实现二者的沟通,又要实现信息的“保密”。
他们想到了以下几种方案:
方案1:
A和B用一套相同的规则对消息进行加密和解密,这套规则需要一个字符串x作为密钥来加密和解密,这样C不知道x的话即使截获到了消息也看不懂内容。
这套方案就是对称加密方案,对称加密方案效率高,但是有个很大的缺陷:A和B怎么商定这个x呢?第一次传递的时候明文把x传递给对方吗?显然不行,因为可能被C截获到,这样C也能解密消息了。
这个时候,人们发明了一种神奇的盒子,这个盒子可以实现只有拥有者可以解开这个盒子,别人只能往里塞信息,却打不开,看不到里面装了啥,A和B正犯愁呢,听说这个神奇的盒子后,想出了一套新的方案:
方案2:
A和B都拿了个黑盒子,他们互相把自己的黑盒子扔给对方,然后彼此把消息放到黑盒子里,扔回去,然后A和B从盒子里拿出对方发送的消息。这样就解决安全问题了,但是有个很大的缺点,就是每条信息两个人都要向黑盒子里塞东西,这个过程太麻烦了,效率很低,于是AB又开始发愁了。
方案二是用的纯非对称加密的方法,其中黑盒子就是非对称加密的公钥,往盒子里扔东西就是用这段公钥对信息加密的过程,之后带有信息的黑盒子只有利用私钥才能解开。
故事里往黑盒子里塞东西的过程很“麻烦”,其实就是非对称加密缺点,计算量大,使得效率降低,因此HTTPS也没有采用这个方案。那么有没有更好的方案呢?当然有~,我们看方案1,其实最大的问题就是密钥x的商讨问题,即A和B怎么互相确定对称加密密钥x,而且还不能明文传输让别人知道,于是有第三套方案
方案3:
方法:A这样操作:给B扔一个黑盒子,B拿到盒子以后,往里放一段随机生成的密钥x,扔回了A。这个过程即是被C截获了,C也拿不到盒子内部的东西,所以是安全的。之后A从盒子里把B给他的密钥拿出来,然后他们就用这段密钥x通过方法1的方式沟通了。
该方法就是现在HTTPS的加密方法,利用的非对称加密+对称加密的方式结合的方式,非对称加密传递确认对称加密的密钥x,之后完全用对称加密传送信息。
那么这套方案就没有漏洞了吗?聪明的C又想出来一个办法:在截获A给B黑盒子时,他也买了一个黑盒子,把这个A给的黑盒子替换成自己的盒子,给了B,B拿到“假盒子”后,把密钥x放了进去,C又截获了这个带有x的黑盒子,因为是自己买的黑盒子,当然能解开了,所以就拿到了密钥x。然后他把x放进A的真盒子,扔给了A,这时A不知道发生了什么,使用盒子里的x作为后续交流的密钥,跟B进行后续的沟通。而其实,C早就知道他俩的密码了,随时都可以拿到消息进行解密。
因此,这套方案唯一的问题就是:客户端怎么知道它拿到的盒子就是服务端给的??从盒子的角度解决吗?但是盒子是一个公钥,只是一个字符串,没法对它进行认证,因此需要借助别的手段来解决这个问题,下面我们探讨这个问题。
如何证明客户端收到的公钥是该网站的公钥
HTTPS采用的类似于身份证的方法,就像公安局一样,所有用https的网站都要有一个“公信”机构颁发的证书,证书就像一个身份证一样,客户端可以对其进行真实有效性判断,从而决定是否“使用”这个盒子。我们仔细想想身份证的使用过程:要想知道“小张”是“小张,分为三步,
- 小张要给你他的身份证
- 这个身份证是真的,不是仿造的
- 这个身份证的名字是他
我们依次看这三个条件对应到HTTPS中是怎么实现的。
- 自然是通过网络传输,服务端把它的证书(身份证)传递给客户端,原来不考虑证书的时候,服务端只需要给客户端一个公钥,而现在,服务端把公钥信息包含在证书内容里了,只需要给客户端证书就行了,客户端可以从证书里获取公钥,也可以看到网站的一些其他信息。
- 身份证是真的,也就是说,证书是真的,证书公信机构CA,负责颁发证书,证书包含两个部分,证书内容和签名,内容就像身份证上的身份证号,姓名等信息,签名就像身份证的防伪手段一样,意义在于防止证书内容被篡改。签名是CA来做的,它会根据网站信息生成明文的证书内容,然后,对内容进行hash,对hash值利用私钥加密生成签名。二者一块发给网站,就是网站的证书。那么客户端怎么辨认证书的真假呢?就像我们知道身份证上有好多防伪技术可以帮我们判断其真伪。答案就是客户端都有CA的公钥(是的,操作系统,浏览器等都存有CA的证书),用公钥对证书签名解密得到一段字符串,跟证书内容进行hash后对比,二者如果相同,则说明证书是可靠真实的。为什么呢?第三方能不能篡改证书内容呢?仔细想想,如果第三方改动了证书内容,它没法将改动后的内容进行加密,因为它没有CA的私钥,也就无法生成合法的数字签名。因此第三方是改不了证书内容的。整个过程如文末的图片所示,注意,这里有个地方容易混淆,即两对公私钥:CA对证书的加密私钥对应客户端早就存在的CA解密公钥;客户端对x密钥加密的公钥和服务端对x密钥解密的私钥。其中x密钥即上文中写的对称加密的密钥,整个过程客户端用了两个公钥,CA和服务端各有一个私钥。
- 怎么证明证书是他?很简单,看证书内容就可以了,证书的内容里包含了网站的域名等信息,如果第三方攻击者把整个证书文件更改了(第三方用他自己的网站证书替换),那客户端很容易从内容里看到证书不是它的,就拒绝跟它沟通,就像你拿到了张三给的身份证,但是上面写着王五,当然你就不理他了!
用通俗的话来表达这个过程,小红A向公安局申请身份证,身份证上写着她的名字和跟B交流用的公钥,公安局制作完毕后给小红,小红A拿着身份证给了B,之后B通过上面的防伪标志和姓名确认了其真伪和正确,用上面的公钥给随机生成的x加密,还给了小红,小红拿着自己的私钥解出了x,二者用x愉快的交流起来~~~
以上就是HTTPS加密的原理浅析,有漏洞之处,欢迎指出~
