# 图解HTTPS

本文是彻底搞懂HTTPS的加密机制 (opens new window)的图文版本,原文较长,结合本文服用效果更佳

HTTP是明文传输的,如图

在传输过程中会经过各种中间节点,传输过程中数据很容易暴露,而且可能会被篡改,由于没有校验机制,双方不会有任何察觉,这就是中间人攻击。假如有一笔银行转账,本该转到A账户,被篡改为转到B账户,后果很严重。

# 对称加密

怎么解决?加密!加密后,中间人看不懂我的数据,也就无法修改。最简单的就是对称加密,什么是对称加密?就是对数据加密和解密采用相同的算法。举个例子

保险箱钥匙就是对称加密的密钥,就算中间人劫持了保险箱也无法破坏里面的数据。

问题是,密钥本质上也是数据,在传输过程中一样有被篡改的可能,客户端和服务器要怎么安全地交换密钥?

# 非对称加密

非对称加密等于有两把钥匙,公钥和私钥,成对出现。用公钥加密的数据只能用对应的私钥解密,反之亦然。私钥存储在服务器,公钥发送到客户端,客户端用公钥加密数据传到服务器,服务器用私钥解密。

这样能保证服务器到客户端的数据安全,那客户端到服务器呢?再加一对公钥&私钥?

这样做的问题是,非对称加密算法非常耗时,加密数据越大耗时越长,而对称加密速度很快,那么,能不能用非对称加密解决对称加密遇到的问题?

# 对称加密 + 非对称加密

用非对称加密算法来解决对称加密密钥的安全传输,后续就可以只用对称加密传输数据了,这样非对称加密、解密分别只用1次就行。具体怎么做?

  1. 客户端对服务器发起请求,服务器返回公钥M给客户端
  2. 客户端随机生成密钥X,用服务器的公钥M加密密钥X并传给服务器
  3. 服务器拿到加密的密钥X,用服务器私钥M解密得到密钥X的明文
  4. 有了密钥X,之后所有数据都用密钥X加密和解密

密钥X在传输过程中被服务器公钥加密过,只有服务器私钥能解密,因此是安全的。

这样真的安全了吗?还不一定

# 中间人攻击

以上步骤1中,无法确定收到的公钥有没有被篡改或者替换过,那么就会出现以下问题:

中间人有一套公钥N&私钥N,他劫持了服务器发到客户端的公钥M,替换成自己的公钥N,客户端拿到公钥N来加密密钥X,回传到服务器过程中又被中间人劫持并解密,中间人就这样拿到了密钥X,后续双方的数据传输对中间人来说,等于是明文传输。下面就来解决这个问题:

现实生活中,政府发的身份证可以证明一个人的身份,对应到计算机世界里,也有类似政府的这么一个发证机构,它叫Certificate Authority,简称CA,CA为每个使用公钥的用户发放一个数字证书数字证书可以证明公钥的合法性。

# 数字证书

数字证书本身会不会被篡改?了解一下数字证书的生成:

  1. CA对网站的资料和公钥使用hash函数得到摘要,再用CA的私钥将摘要加密生成数字签名
  2. CA将网站的资料和公钥以及数字签名再加上证书有效期,生成数字证书

假设数字签名被篡改,数字签名就无法用CA的公钥解密;
假设数字证书的公钥被篡改,将数字证书的公钥和网站信息使用相同的hash函数得到hash值A,然后用CA的公钥解密数字签名得到hash值B,对比A和B,如果不一样,说明公钥被篡改

# 总结

以上就是HTTPS的来龙去脉,如果你能回答下面的问题,说明你已经理解得差不多了:

  • 为什么要用对称加密+非对称加密?
  • 为什么需要数字证书
  • 为什么需要数字签名
上次更新: 10/23/2021, 10:33:11 PM