# 图解HTTPS
本文是彻底搞懂HTTPS的加密机制 (opens new window)的图文版本,原文较长,结合本文服用效果更佳
HTTP是明文传输的,如图
在传输过程中会经过各种中间节点,传输过程中数据很容易暴露,而且可能会被篡改,由于没有校验机制,双方不会有任何察觉,这就是中间人攻击
。假如有一笔银行转账,本该转到A账户,被篡改为转到B账户,后果很严重。
# 对称加密
怎么解决?加密!加密后,中间人看不懂我的数据,也就无法修改。最简单的就是对称加密
,什么是对称加密?就是对数据加密和解密采用相同的算法。举个例子
保险箱钥匙就是对称加密的密钥,就算中间人劫持了保险箱也无法破坏里面的数据。
问题是,密钥本质上也是数据,在传输过程中一样有被篡改的可能,客户端和服务器要怎么安全地交换密钥?
# 非对称加密
非对称加密等于有两把钥匙,公钥和私钥,成对出现。用公钥加密的数据只能用对应的私钥解密,反之亦然。私钥存储在服务器,公钥发送到客户端,客户端用公钥加密数据传到服务器,服务器用私钥解密。
这样能保证服务器到客户端的数据安全,那客户端到服务器呢?再加一对公钥&私钥?
这样做的问题是,非对称加密算法非常耗时,加密数据越大耗时越长,而对称加密速度很快,那么,能不能用非对称加密解决对称加密遇到的问题?
# 对称加密 + 非对称加密
用非对称加密算法来解决对称加密密钥的安全传输,后续就可以只用对称加密传输数据了,这样非对称加密、解密分别只用1次就行。具体怎么做?
- 客户端对服务器发起请求,服务器返回公钥M给客户端
- 客户端随机生成密钥X,用服务器的公钥M加密密钥X并传给服务器
- 服务器拿到加密的密钥X,用服务器私钥M解密得到密钥X的明文
- 有了密钥X,之后所有数据都用密钥X加密和解密
密钥X在传输过程中被服务器公钥加密过,只有服务器私钥能解密,因此是安全的。
这样真的安全了吗?还不一定
# 中间人攻击
以上步骤1中,无法确定收到的公钥有没有被篡改或者替换过,那么就会出现以下问题:
中间人有一套公钥N&私钥N,他劫持了服务器发到客户端的公钥M,替换成自己的公钥N,客户端拿到公钥N来加密密钥X,回传到服务器过程中又被中间人劫持并解密,中间人就这样拿到了密钥X,后续双方的数据传输对中间人来说,等于是明文传输。下面就来解决这个问题:
现实生活中,政府发的身份证可以证明一个人的身份,对应到计算机世界里,也有类似政府的这么一个发证机构,它叫Certificate Authority,简称CA,CA为每个使用公钥的用户发放一个数字证书
,数字证书
可以证明公钥的合法性。
# 数字证书
数字证书
本身会不会被篡改?了解一下数字证书
的生成:
- CA对网站的资料和公钥使用hash函数得到摘要,再用CA的私钥将摘要加密生成
数字签名
- CA将网站的资料和公钥以及
数字签名
再加上证书有效期,生成数字证书
假设数字签名被篡改,数字签名就无法用CA的公钥解密;
假设数字证书
的公钥被篡改,将数字证书
的公钥和网站信息使用相同的hash函数得到hash值A,然后用CA的公钥解密数字签名得到hash值B,对比A和B,如果不一样,说明公钥被篡改
# 总结
以上就是HTTPS的来龙去脉,如果你能回答下面的问题,说明你已经理解得差不多了:
- 为什么要用对称加密+非对称加密?
- 为什么需要
数字证书
? - 为什么需要
数字签名
?