为什么需要加密?
因为 http 的内容是明文传输的,会经过中间代理服务器、路由器、wifi 热点、通信服务运营商等多个物理节点,如果信息在传输过程中被劫持,传输的内容就完全暴露了,可以篡改传输的信息且不被双方察觉,这就是中间人攻击。所以需要对信息进行加密。
对称加密
一个密钥,它可以对一段内容加密,加密后只能用它才能解密看到原本的内容。
传输过程:
- 由服务器生成一个密钥并明文传输给浏览器。
- 浏览器把内容用密钥加密后返回给服务器。
- 服务器用密钥解密得到内容。
缺陷:密钥被中间人劫持失效。
非对称加密
两把密钥,一把公钥、一把私钥。用公钥加密的内容用私钥才能解开,同样,私钥加密的内容只有公钥能解开。
传输过程:
- 服务器把公钥明文传输给浏览器。
- 浏览器把内容用公钥加密后返回给服务器。
- 服务器用私钥解密得到内容。
中间人即使劫持到公钥也无法对传输内容解密。
缺陷:公钥可以解密从服务器传给浏览器的内容。
非对称加密 (改良)
用两组公钥私钥
缺陷:非对称加密算法非常耗时
非对称加密+对称加密 混合加密 (HTTPS)
传输过程:
- 服务器把公钥传输给浏览器。
- 浏览器随机生成一个用于对称加密的密钥 X,用公钥加密后传给服务器。
- 服务器用私钥解密得到密钥 X。
- 这样双方都拥有密钥 X 了。之后双方所有数据都用密钥 X 加密解密。
漏洞:
- 中间人准备了一对公钥 B、私钥 B。
- 在服务器把公钥 A 传输给浏览器时,中间人将其调包为自己的公钥 B 返回给浏览器,并将公钥 A 保存。
- 浏览器用公钥 B 加密内容发送,中间人用自己的私钥 B 解密得到内容,然后其调包为原来的公钥 A 再返回给服务器。
- 服务器用私钥 A 解密得到被中间人劫持过的内容。
需要解决:在第 2 步中证明浏览器收到的公钥一定是从服务器发来的公钥,而不是中间人的假冒品。
CA 认证
漏洞:伪造 CA 证书。
数字签名
为内容生成一份“签名”,比对内容和签名是否一致就能察觉是否被篡改。
数字签名的生成过程:
- CA 拥有一对非对称加密的私钥和公钥。
- CA 对证书明文信息进行 hash。
- 对 hash 后的值用私钥加密,得到数字签名。
浏览器验证过程:
主要就是对数字签名进行解密。与内容做对比。
得到 [被 CA 私钥加密过的] 内容 和 数字签名。
用 CA 机构的公钥对 加密过的数字签名 解密,得到 数字签名。
由于 CA 是浏览器信任的机构,所以浏览器保有 CA 的公钥。
- 用证书里说明的 hash 算法对 数字签名 进行 hash 得到 [被数字签名保护内容]。
- 比较 [被数字签名保护内容] 是否等于 内容,等于则表明证书可信。
为什么需要 hash ?
hash 后得到的是固定长度的信息加密解密会快很多。
如何证明 CA 公钥是可信的?
浏览器保有 CA 公钥,怎么证明这个公钥是否可信?
操作系统、浏览器本身会预装一些它们信任的根证书(例如 CA 证书)。
HTTPS 必须在每次请求中都要先在 SSL/TLS 层进行握手传输密钥吗?
服务器会为每个浏览器(或客户端软件)维护一个 session ID,在 TSL 握手阶段传给浏览器,密钥会缓存到 session。在会话期间不需要重复认证。