https

61 阅读3分钟

写在前面

这篇文章并没有很系统的阐述https,仅是在为什么这样设计这个问题上进行了简单的论述,如果有讲得不明白或是错误的地方,请在评论区指出。

http

http是明文的,黑客可以对其进行窃听、篡改、冒充,即便http2.0是纯二进制的,也仅是对非技术人员不透明,对于黑客而言仍是裸奔,因此需要对报文加密。

加密过程

加密算法需要输入一个字符串,也就是密钥。

密钥需要一端随机生成,为了另一端能解密,就势必要将密钥传输给另一端。然而密钥在传输过程中裸奔了。

为什么不前后端约定好一个密钥从而避免通信过程中泄露

可以通过打入内部、人情世故等方式获得密钥。

非对称式密码学

需要公钥和私钥,公钥用来加密,全世界只有私钥可以对其解密。

如何解决裸奔问题

  1. 后端将公钥传给前端(反正全世界只有对应的私钥可以解密,黑客拿到也无所谓)
  2. 前端随机生成一个密钥
  3. 用公钥对密钥进行加密并发送给后端
  4. 后端用私钥解密拿到密钥

这样,后端就隐秘的拿到了密钥,前后端可以进行加密通信。

为什么不直接用公钥加密报文

因为这样做,http通信就变成单向的了,一端只能加密,另一端只能解密。

当然也有一种方案,前端收到公钥1后,再生成一对公钥2和密钥2,用公钥1将公钥2加密发给后端,后端用私钥1解密得到公钥2,这样前后端都有公钥和私钥,就可以通过非对称加密算法进行加密通信。

然而这种方案严重影响性能,非对称加密算法比正常的加密算法慢1000倍,还要在通信中频繁使用,这种代价是不可承受的。

仍存在的问题

加密只是防止了窃听,篡改和冒充的问题尚未解决。下面看一下https是怎样做的。

https的握手过程

  1. 前端要求与后端建立SSL连接,请求中包含使用的协议版本号、生成的一个随机数、以及前端支持的加密方法
  2. 后端收到请求后,确认双方使用的加密方法、并给出后端的证书(内含公钥)、以及一个后端生成的随机数
  3. 前端确认后端证书有效后,生成一个新的随机数,并使用数字证书中的公钥,加密这个随机数,然后发给后端。并且还会提供一个前面所有内容的hash的值,给后端检验
  4. 后端使用自己的私钥,来解密前端发送过来的随机数。并提供前面所有内容的hash值来供前端检验
  5. 前端和后端根据约定的加密方法使用前面的三个随机数生成对话密钥,以后的对话过程都使用这个密钥来加密信息

其中,检验hash值可以判断报文是否遭到过篡改,证书起到了身份验证的作用。