HTTPS中用到的SSL加密原理由浅入深详解
原文链接
文章目录
一,对称加密
二,非对称加密
三,对称+非对称加密
四、中间人攻击
五、CA认证
六、windows查看系统CA根证书
七、客户端认证https服务端证书过程详解——证书链
一,对称加密
对称加密是指服务器和客户端都使用相同的秘钥加密和解密数据,当用户和服务器建立加密连接时,用户会得到服务器唯一的数据加密的秘钥,所有的用户,包括服务器,都是使用这个唯一的秘钥加密自己的信息的。
如:客户A在使用秘钥K加密传输,被加密的密文被发送到服务器上后,服务器使用相同的秘钥K便可以解密出A发送的密文。
此时假如用户B也和服务器建立加密连接,这里用户B使用的秘钥也是K,也就是说用B的秘钥是可以解密A的加密信息的。这就体现出了对称加密的一个巨大的漏洞:秘钥的唯一性
在对称加密算法中,所有的加密报文都可以被同一个开放的秘钥K加解密。那么,当用户B在与服务器请求到秘钥K后,在通过对A的抓包后,便可使用秘钥K解密A的所有加密报文,从而获取A的隐私信息。
图解如下:
所以,对称加密由于秘钥K的唯一性,几乎等于明文传输,所以不可用。
二,非对称加密
因对称加密的不安全性不可用,所以有出现的新的加密方式:非对称加密。
首先,对称加密的两大缺点是,秘钥的唯一性和秘钥的公开性。但是在非对称加密中,这两个缺点都得到了较好的解决。
非对称加密,顾名思义,客户与服务器双方使用的加密的秘钥是不同的。在非对称加密中,原来唯一的秘钥K,被拆分为了两个不同的秘钥。分别为服务器的私钥SK,和发给客户机的公钥PK。其中,公钥PK是公开给用户获取的,而私钥SK是一直保存在服务器端的,不向外开放的。
非对称的加密解密流程为:被私钥SK加密的报文只能被公钥PK解密,反之,被公钥PK加密的报文只能被私钥SK解密。即在非对称加密中公钥加密的密文是无法被公钥解密的!
#私钥:SK
#公钥:PK
#客户机数据:A Data
#服务器数据:S Data
#客户加密报文:Y
#服务器加密报文:Y`(AData+PK)=Y(Y+SK)=AData
(SData+SK)=Y`(Y`+PK)=SData
非对称加密流程图解:
以上,就是非对称加密的基本原理。
如此一来,每一个客户都只有公钥,黑客便无法获得用户发送的隐私信息了(因为用户发送的数据也是公钥加密的,公钥无法解密)。但是,黑客仍然有公钥,所以他仍然能够解密服务器发送的信息(服务器发送的信息是私钥加密的,可以用公钥解密)。因此非对称加密仍然是不太安全的。
三,对称+非对称加密
因为非对称机密仍然是不安全的,所以,人们结合了对称与非对称加密各自的优点,并由此创建了对称+非对称加密。
首先,我们来总结一下之前两种加密方式各自的优缺点:
对称加密
客户与服务器双方使用相同的秘钥加密。
只要秘钥不被泄露,那么黑客就不能知道双方任何一方的信息。
非对称加密
客户和服务器使用不同的秘钥进行加密。
黑客只能得知服务器发送的信息。
既然对称加密的秘钥不泄露,黑客就不能获取隐私信息。非对称加密中,黑客又不能获取客户发送的信息。那么如果我使用非对称加密来加密对称加密的秘钥,再发给服务端,服务端获得这个对称加密的密钥后,使用对称加密传输数据,这样其他用户便不能得知我使用的秘钥了。
这便是对称+非对称加密的创立思想。接下来我们详细介绍其原理。
客户端向服务器请求公钥,服务器下发,
客户端使用公钥加密自己随机生成的对称加密的秘钥,发送给服务器,
服务器解析后,使用对称加密与客户机进行通讯。
如此一来,黑客便不能得知客户机向服务器发送的秘钥,从而客户端和服务器端任何一方的信息黑都不能得知了。
#私钥:SK
#公钥:PK
#秘钥:K#客户机数据:A Data#服务器数据:S Data#X:非对称加密后的K#客户加密报文:Y#服务器加密报文:Y`(PK+K)=X(SK+X)=K(K+SData)=Y`(K+AData)=Y
图解:
如上图,
服务器先下发公钥给客户端(黑客可以得知)
客户端指定秘钥K,并用公钥PK加密后发送给服务器(黑客不能解密)
服务器收到密文用私钥SK解密,使用K加密信息发送给客户端(黑客没有K所以不能得知)。
客户端继续用K加密信息进行通信。(黑客不可得知)
至此,黑客只能获得服务器的公钥,其它信息都无法获取
如此一来,对称+非对称加密的加密方式已经可以保证用户的信息不会被其他用户解密了,无论是服务器的信息还是客户端的信息。
四、中间人攻击
虽然对称+非对称加密已经看似十分安全了,但是仍然存在漏洞。
试想一下,如果黑客在客户访问访问服务器之前,对客户进行DNS劫持,使得客户访问到黑客自己建立的伪装服务器,伪装服务器拥有自己的私钥公钥对,客户所申请到的公钥是伪装服务器的伪公钥(FPK),当客户端使用FKP与伪装服务器建立连接后,此时,黑客可以通过自己的伪公钥和伪私钥对客户端发送的所有加密报文进行解密。再通过使用客户端发送的信息去与真正的服务器进行通讯,并将服务器响应的信息通过自己的伪服务器返还给客户端。如此,伪装服务器就能获取到用户和服务器传输的所有信息
图解:
如此一来,黑客可以通过自己的伪造服务器得知客户端的所有隐私信息,而客户端却无法察觉到黑客的存在,仍然认为自己在与真正的服务器进行通讯。
五、CA认证
既然对称+非对称加密也是不安全的,那么我们仍然需要一项新的技术来保证我们http通讯的安全。
首先,我们来分析一下中间人攻击所利用的漏洞:客户端向服务器发起连接,服务器下发秘钥,进行连接。如此一来,客户端其实并不能判断自己是否是在与真正的服务器端进行连接。这也就给了黑客伪造服务器的机会。
那么我们明白了,黑客利用了自己的公钥替换了真正网站的公钥来达到的目的,那如果能保证自己获得的公钥确实是真正网站的公钥,就可以确保自己在与真正的服务器进行连接了。
那么,我们该如何使公钥可以验证服务器的身份呢?
这里我们引入一个第三方验证机构,所有的公网服务器都要向这个第三方验证机构进行身份核实,然后第三方验证机构向他发送一个证书,证明这个服务器是真实的。
在真实环境中,这个所谓的第三方验证机构叫做CA证书机构(Certificate Authority),而服务器的身份是指服务器所使用的DNS域名。
CA提供一套非对称加密系统,所有希望被CA认证的服务器都要将自己的公钥发送给CA,当CA认证了服务器的身份(DNS域名)后,就就会用自己的私钥(CSK)来加密服务器的公钥PK,加密后的文件便是该服务器的证书(Lience),并返还给该服务器。
当客户端要与服务器通讯时,客户端先向服务器请求证书,收到证书后,由于证书是有CA证书颁发中心的私钥CSK加密的,所以需要公钥CPK解密,但是如果客户端向CA证书服务器请求的话,就又会被中间人攻击。所以,为了防止这种情况的发生,所有有效的CA证书颁发机构的公钥CPK都是被预安装在操作系统中的(一般通过安装浏览器或者安装/更新操作系统这些可信的方式将这些CPK安装到系统中),客户端不用向CA中心申请,直接使用本地操作系统内的CPK,这样就避免了被中间人攻击。
在解密证书(Lience)后,客户端得到了公钥PK,同时由于证书可以被信任的CPK解密,所以该服务器是可信任的,之后,便可和服务器进行通讯了。
图解:
至此,CA证书验证系统的基础原理已经讲完了。
现在几乎所有的https加密协议都是使用CA证书的验证。
六、windows查看系统CA根证书
上一节提到了系统预安装的CA证书,那么如何查看这些证书呢,windows系统的朋友可以查看笔者的另外一篇文章:windows查看系统证书
七、客户端认证https服务端证书过程详解——证书链
客户端浏览器从收到服务端发送过来的证书开始,是怎么验证证书的合法性,并从里面获取到服务端的公钥的呢,这个涉及到证书链的概念,详情可见两外一篇文章:客户端认证https服务端证书过程详解——证书链