https的加密流程

文章目录

  • 一、两种加密方式
  • 二、https的加密流程
    • 2.1对称加密
    • 2.2非对称加密
    • 2.3中间人攻击问题
    • 2.4使用证书来校验客户端收到的公钥是否是服务器生成的公钥
      • 2.4.1证书的校验
      • 2.4.2证书的校验所得到的效果

一、两种加密方式

https在http的基础之上引入了加密机制(加密层)。https加密的一系列流程是由SSL(后来改名为了TLS)协议来规定的,SSL(后来改名为了TLS)协议不仅用在https中,也应用在其它很多的场景里。
使用密钥(yue/yao/shi)加密,主要有两种方式:
①对称加密。加密和解密使用的密钥是同一个密钥。相当于明文+密钥=密文,密文+密钥=明文。
②非对称加密。有两个密钥,一个称为公钥一个称为私钥(公钥可以公开,私钥不公开)。相当于明文+公钥=密文,密文+私钥=明文或者明文+私钥=密文,密文+公钥=明文。

二、https的加密流程

https加密的目标是对http的header和body进行加密。

2.1对称加密

客户端使用密钥对数据进行对称加密,服务器拿着同一个密钥对数据进行解密。由于黑客没有密钥,所以黑客无法获取到加密之前的内容。

然而上面的加密流程存在问题:
服务器会给多个客户端提供服务,这多个客户端用的密钥必须是不同的,因为客户端用的密钥都是相同的话那么密钥就扩散得太严重了黑客也容易拿到密钥,如果用服务器来维护多个客户端和多个密钥之间一一对应的关系,那么服务器的开销太大了。所以更推荐的做法是在客户端和服务器建立连接的时候协商好这次传输的密钥是什么(涉及到随机数机制,保证每个客户端生成的密钥都不相同),然后客户端把密钥通过网络传输给服务器。
这时会有问题,因为如果黑客截获到网络传输中的密钥,那么密钥就泄露了,后续的加密流程就毫无意义了。所以要对用于对称加密的密钥(下面简称对称密钥)进行加密,而对对称密钥加密又要在网络上传输一个新的对称密钥,如此往复循环下去,最终还是有对称密钥泄漏的风险,所以仅用对称加密的方式进行加密是行不通的,由此在对称加密的基础上引入非对称加密。

2.2非对称加密

①服务器生成一对公钥和私钥,服务器把公钥返回给客户端,服务器自身把私钥藏好。
②客户端仍然生成对称密钥,使用服务器的公钥对对称密钥进行加密,然后把这个加密后的对称密钥发送给服务器。如果黑客拿到加密后的对称密钥是无法对其进行解密的,因为公钥加密后的对称密钥需要用私钥才能解密,而私钥只有服务器才有。
③加密后的对称密钥到达服务器之后服务器用私钥解密出对称密钥,然后服务器返回一个响应给客户端告诉客户端这次传输确认用的是这个对称密钥(响应用对称密钥进行加密)。
④接下来客户端和服务器就使用这个对称密钥对业务数据进行加密即可。

为什么不全部流程都用非对称加密呢,这样安全性不就更高了吗?因为非对称加密和解密的运算成本很高速度慢,对称加密运算成本低速度快,如果全部流程都使用非对称加密则数据整体的传输效率将会变得很慢。

比较科学的做法是:使用非对称加密加密的是某个关键环节(体积不大的一次性工作,比如加密对称密钥),这时运算成本还是比较低的。后续使用效率更高的对称加密来加密大量的业务数据。

但上述对称加密+非对称加密还存在一个问题,就是中间人攻击问题。

2.3中间人攻击问题

中间人攻击问题产生的原因以及过程:
①客户端向服务器发送询问公钥的请求,服务器收到请求后生成一对公钥1和私钥1并将公钥1返回给客户端。
②返回给客户端的公钥1在网络传输的过程中经过黑客入侵的网络设备,此时黑客截获公钥1并且生成一对公钥2和私钥2,黑客把公钥2返回给客户端。
③客户端以为公钥2是服务器返回的公钥,于是用公钥2对对称密钥进行了加密,并把加密后的对称密钥发送给服务器。
④加密后的对称密钥在网络传输的过程中经过黑客入侵的网络设备,因为这个密文是用公钥2进行加密的,要有私钥2才能对其进行解密,而黑客手中正好有私钥2,所以黑客对密文解密后拿到对称密钥。然后用截获到的公钥1对对称密钥重新进行加密(这样就能瞒天过海地让服务器不会发现黑客的存在了),并发送给服务器。
⑤服务器收到加密的对称密钥后,用私钥1对其进行解密也拿到了对称密钥。然后服务器返回一个响应给客户端告诉客户端这次传输确认用的是这个对称密钥(响应用对称密钥进行加密)。
⑥接下来客户端和服务器就使用这个对称密钥对业务数据进行加密。因为黑客已经拿到了对称密钥,所以对称密钥对业务数据的加密就形同虚设了。

那么如何解决中间人攻击问题呢?出现中间人攻击问题是因为客户端对发过来的公钥没有分辨能力,比如上面例子中客户端无法识别出公钥2是黑客发送过来的而不是服务器发送过来的。
因此要引入第三方公正机构,让公正机构来辨别发过来给客户端的公钥是黑客生成的公钥还是服务器生成的公钥。

2.4使用证书来校验客户端收到的公钥是否是服务器生成的公钥

①网站的开发人员搭建服务器的时候会生成一份公钥和私钥(这里的公钥和私钥只要一份就行,不用像对称密钥那样每个客户端都要有不一样的对称密钥。因为针对每个客户端都要有不同的一份公钥和私钥的话那服务器的压力太大了,服务器针对每个客户端都要生成公钥和私钥并且保存,还要验证是哪个客户端发来的信息并解密等)。
然后服务器向公证机构提出申请(提交申请要有材料比如域名、服务器的公钥、厂商……),公证机构对申请进行审核,审核通过就会给服务器颁发一个证书,服务器会保存好这个证书。证书是一段结构化的数据,这段结构化的数据包括一些重要信息,比如网站域名、服务器的公钥、证书的过期时间、数字签名……
②这时开始时就不是客户端向服务器发送询问公钥的请求了,而是客户端向服务器发送询问服务器证书的请求,然后服务器返回证书给客户端。
③客户端拿到了证书也就拿到了证书中服务器的公钥,客户端会验证这个公钥是否是服务器的公钥,这个验证过程叫证书的校验。

2.4.1证书的校验

①数字签名(被加密后的证书的校验和):证书中有一个数字签名,数字签名是一个被加密后的证书的校验和。公正机构在颁发证书给服务器的时候,会把针对证书中的内容计算出校验和并且对这个校验和进行加密,这个加密后的校验和就是数字签名。
②得到数字签名(被加密后的证书的校验和)的加密过程:数字签名的加密是非对称加密。公证机构会生成一对自己的公钥和私钥,公证机构自己持有私钥,公钥发布给各个客户端设备(公钥会内置到主机的操作系统中),然后公正机构用自己的私钥对证书的校验和进行加密就得到了数字签名。
③客户端收到服务器发来的证书之后,也就拿到了数字签名,然后客户端通过操作系统内置的公正机构的公钥对数字签名进行解密得到证书的校验和。客户端再重新计算发送过来的证书的校验和,和解密出来的校验和进行对比,如果两个校验和一致,就认为证书没有被黑客篡改过,证书的公钥就是服务器生成的公钥而不是黑客生成的公钥。

2.4.2证书的校验所得到的效果

有了证书的校验这一套机制,就可以有效缓解中间人攻击问题了,因为如果黑客篡改了证书中的内容会很容易被发现,而且黑客也无法申请一个证书来替换掉服务器的证书。
①客户端很容易发现黑客篡改了证书中除数字签名之外的内容:当证书到达黑客入侵的网络设备时,如果黑客将证书中的服务器的公钥替换成自己的公钥,客户端在进行证书校验的时候,就会发现校验和不一样,客户端就可以认为证书内容已经被黑客篡改过了,客户端这时往往会弹出一些对话框来警告用户存在安全风险。
2)客户端很容易发现黑客篡改了数字签名:因为得到数字签名是加密后的证书的校验和,加密过程使用的是公证机构的私钥来进行加密。如果黑客截获到证书后计算出证书中除数字签名之外的内容的校验和,然后用自己的私钥对校验和进行加密得到自己的数字签名替换掉证书中的数字签名,这时这个证书发送给客户端的时候客户端就无法使用公证机构的公钥对数字签名进行解密然后拿到证书的校验和了。而操作系统中公证机构的公钥是客户端操作系统内置的,黑客无法将其替换。
3)黑客无法申请一个证书来替换掉服务器的证书:因为申请证书需要提交材料,比如提交的材料中有网站的主域名,公证机构会认证网站的主域名是否是黑客所有,黑客想要说别人的主域名是自己的,这显然是不能通过审核的。

你可能感兴趣的:(https,网络协议,http)