一、什么是HTTPS?
1.1 什么是HTTPS?
HTTPS 也是一个应用层协议. 是在 HTTP 协议的基础上引入了一个加密层
1.2 为什么引入HTTPS?
HTTP 协议内容都是按照文本的方式明文传输的. 这就导致在传输过程中出现一些被篡改的情况
比如臭名昭著的 "运营商劫持"
由于我们通过网络传输的任何的数据包都会经过运营商的网络设备(路由器, 交换机等), 那么运营商的网络设备就可以解析出你传输的数据内容, 并进行篡改.
点击 "下载按钮", 其实就是在给服务器发送了一个 HTTP 请求, 获取到的 HTTP 响应其实就包含了该 APP 的下载链接. 运营商劫持之后, 就发现这个请求是要下载天天动听, 那么就自动的把交给用户的响应给篡改成 "QQ浏览器" 的下载地址了
1.3 什么是加密?
加密就是把 明文 (要传输的信息)进行一系列变换, 生成 密文
解密就是把 密文 再进行一系列变换, 还原成 明文
在这个加密和解密的过程中, 往往需要一个或者多个中间的数据, 辅助进行这个过程, 这样的数据称为 密钥
既然要保证数据安全, 就需要进行 "加密".
网络传输中不再直接传输明文了, 而是加密之后的 "密文".
加密的方式有很多, 但是整体可以分成两大类: 对称加密 和 非对称加密
1.4 对称加密
1.5 非对称加密
二、HTTPS的工作过程
2.1 使用对称加密
🚑问题:客户端生成的密钥key要发给服务器,服务器才能解密,如果被黑客截获了key,黑客就成功入侵并可以篡改数据
如何让密钥key无法被黑客获取?
2.2 使用非对称加密
客户端生成一个对称私钥key,服务器生成一个公钥pub和一个私钥pri
- 客户端在本地生成对称密钥, 通过公钥加密, 发送给服务器
- 客户端在本地生成对称密钥, 通过公钥加密, 发送给服务器由于中间的网络设备没有私钥, 即使截获了数据, 也无法还原出内部的原文, 也就无法获取到对称密钥
- 服务器通过私钥解密, 还原出客户端发送的对称密钥. 并且使用这个对称密钥加密给客户端返回的响应数据
- 后续客户端和服务器的通信都只用对称加密即可. 由于该密钥只有客户端和服务器两个主机知道, 其他主机/设备不知道密钥即使截获数据也没有意义
🚑问题:有可能客户端最开始获取的公钥是黑客截获后伪造的!
2.3 中间人攻击
黑客伪造公钥
🚑问题:防护中间人攻击的最关键问题就是客户端如何信任公钥?
2.4 证书
在客户端和服务器刚一建立连接的时候, 服务器给客户端返回一个 证书 .
这个证书包含了刚才的公钥, 也包含了网站的身份信息
证书可以理解成是一个结构化的字符串, 里面包含了以下信息:
- 证书发布机构
- 证书有效期
- 公钥
- 证书所有者
- 签名
当客户端 获取到这个证书之后, 会对证书进行校验: - 判定证书的有效期是否过期
- 判定证书的发布机构是否受信任(操作系统中已内置的受信任的证书发布机构).
- 验证证书是否被篡改: 从系统中拿到该证书发布机构的公钥, 对签名解密, 得到一个 hash 值(称为数据摘要), 设为 hash1. 然后计算整个证书的 hash 值, 设为 hash2. 对比 hash1 和 hash2 是否相等.如果相等, 则说明证书是没有被篡改过的.
特别注意:这里共涉及五把锁