Https的加密机制

Https的加密机制

1:对称加密

对称加密就是有一个密钥,他可以对一段内容进行加密,加密后只能用它才能解密看到内容

使用对称加密可行吗?

如果通信双方各持有同一个密钥,且没有别人知道,这两方的通信安全当然可以是被保证的。

那么最大的问题是这个密钥怎么传输只让双方知晓,同时不被别人知道。如果浏览器生成一个密钥并传送给浏览器,这个传输过程种密钥被别人劫持到手了怎么办?之后他就可以用密钥解开双方传输的任何内容了,这样当然是不行的。

2:非对称加密

有两把密钥,一把公钥,一把私钥,用公钥加密的内容必须用私钥才能够解密;同样,用私钥加密的过程必须用私钥才能解密

​ 鉴于非对称加密的机制,我们可能会这样的思路:服务器先把公钥直接传输给浏览器,那么浏览器用公钥可以加密数据,这条数据的安全可以保证。但是如何保证服务器到浏览器的数据时安全的呢?如何服务器将数据通过私钥加密后传输给浏览器,那么浏览器可以通过公钥进行解密,而这个公钥一开始是通过明文传输的,这个公钥被谁劫持了,它就能用该公钥解密服务器传来的信息了。所以目前只能保证由浏览器向服务器传输数据的安全性

改良的对称加密可不可以呢?

  1. 某网站有用于对于非对称加密的公钥A,私钥A-;浏览器拥有用于非对称加密的公钥B,私钥B-
  2. 浏览器向网站服务器请求,服务器把公钥A传给浏览器
  3. 之后浏览器向服务器传输的所有东西都采用公钥A加密,服务器收到后用私钥A-解密。由于只有服务器才有这个私钥A-,可以解密,所以能保证这条数据的安全
  4. 服务器向浏览器传输的所有东西都用公钥B加密,浏览器收到后用私钥B-解密,也可以保证这条数据的安全性

采用这样的方法确实可以。那么Https为什么不采用这种加密的当时方式。最主要的原因是非对称加密算法非常耗时,特别是加密一些比较大的数据的时候力不从心,所以必须要用对成加密。那我们是否可以采用对称加密+非对称加密的方式解决加密问题呢?

3:Https加密过程

非对称加密+对称加密

  1. 客户端发起Https请求:用户在浏览器输入一个Https网址,然后连接到服务端的443端口
  2. 服务端的配置:采用Https的服务器必须要有一套数字证书。这套证书其实就是一对公钥和私钥。
  3. 传送证书:传送的证书是公钥,只是包含了很多信息。例如:证书颁发的机构,过期时间等
  4. 客户端解析证书:这部分工作由客户端的SSL/TLS来完成的,首先会验证公钥是否有效。如果发现异常,则会弹出一个警示框,指示证书出现问题。如果证书没有问题,就生成一个对称加密的随机值val,然后用公钥对这个随机值进行加密
  5. 传送加密信息:此时传送的是用证书加密后的加密值,目的是为了能够让服务端得到这个加密值。以后服务端就可以通过这个随机值进行加密解密了。
  6. 服务端解密信息:服务端用私钥解密后,得到了客户端传过来的随机值val。此时客户端与服务端都拥有密钥随机值val,之后双方的所有数据都用密钥随机值val加密解密
  7. 传输加密后的信息:此时的信息就是被随机值val加密后的信息,可以在客户端进行解密
  8. 客户端解密:客户端使用密钥随机值val进行解密

4:中间人攻击

这里我们假设公钥A,私钥A-,浏览器生成的密钥B(随机值val)

中间人无法直接拿到密钥B,因为密钥B本身被公钥A加密了,只有服务器的私钥A-揭开才能拿到他。那么中间人完全不需要拿到私钥A-就能够干坏事

  • 某网站拥有用于非对称加密的公钥A,私钥A-
  • 浏览器向网站服务请求,服务器把公钥A明文传给浏览器
  • 中间人劫持到公钥A,保存下来,把数据包中公钥A替换为自己的伪造公钥B
  • 浏览器随机生成一个用于对称加密的密钥X,用公钥B(浏览器不知道公钥被替换了)加密后传给服务器
  • 中间人劫持后用私钥B-,解密得到密钥X,再用公钥A加密后传给服务器
  • 服务器拿到后用私钥A-,解密得到密钥X

这种在双方都不知道的情况下,中间人得到了密钥B。根本原因是:浏览器无法确认自己收到的公钥是不是网站自己的

1:如何证明浏览器收到的公钥一定是该网站的公钥
数字证书

网站在使用Https前,需要向CA机构申请颁发一份数字证书,数字证书里有证书持有者,证书持有者的公钥等信息,服务器把证书传给浏览器,浏览器从证书里取出公钥就行了。那么数字证书在传输的过程中如何防止被篡改?

如何防止数字证书被篡改

我们把证书内容生成一份“签名”,比对证书内容与签名是否一致就能察觉到是否被篡改。这种技术叫做数字签名

数字签名
  1. 数字签名的制作过程
    1. CA拥有非对称加密的私钥和公钥
    2. CA对证书明文信息进行hash
    3. 对hash后的值用私钥加密,得到数字签名
  2. 浏览器验证过程
    1. 拿到证书,得到明文T,数字签名S
    2. 用CA机构的公钥对S进行解密,得到S-
    3. 用证书内的hash算法对明文T进行hash得到T-
    4. 比较S-与T-是否相等,相等则表示证书可信

你可能感兴趣的:(面试,计算机网络)