文章目录
- 1. HTTPS 是什么
- 2. 常见的加密方式
- 3. 数据摘要
- 4. 加密方案测试
- 4.1 只是用对称加密
- 4.2 只使用非对称加密
- 4.3 双方都使用非对称加密
- 4.4 对称 + 非对称
- 5. 证书
- 5.1 数据签名
- 5.2 CA 证书
- 5.3 方案五 非对称加密 + 对称加密 + 证书认证

1. HTTPS 是什么
HTTP 协议内容都是按照文本的方式明文传输的,这就导致在传输过程中出现一些被窃取、篡改的情况。
- 因为 http 的内容是明文传输的, 明文数据会经过路由器、 wifi 热点、 通信服务运营商、 代理服务器等多个物理节点, 如果信息在传输过程中被劫持, 传输的内容就完全暴露了。
- 劫持者还可以篡改传输的信息且不被双方察觉, 这就是中间人攻击,所以我们才需要对信息进行加密。
HTTPS 也是一个应用层协议,是在 HTTP 协议的基础上引入了一个加密层
加密就是把明文(要传输的信息)进行一系列变换,生成密文
解密就是把密文再进行一系列变换,还原成明文
在这个加密和解密的过程中,往往需要一个或者多个中间的数据,辅助进行这个过程,这样的数据称为密钥。
2. 常见的加密方式
- 对称加密
对称加密:采用单钥密码系统的加密方法,同一个密钥可以同时用作信息的加密和解密。
- 特征: 用什么加密就用什么解密(一个密钥)
- 特点: 算法公开、 计算量小、 加密速度快、 加密效率高
- 例如:异或运算就是一种简单的对称加密方式
- 非对称加密
非对称加密:需要两个密钥来进行加密和解密,这两个密钥是公开密钥(公钥) 和私有密钥(私钥)
- 特征:通过公钥对明文加密,则需要使用私钥解密(公钥加密,私钥解密);通过私钥对明文加密,则需要使用公钥解密(私钥加密,公钥解密)
- 特点: 算法强度复杂、安全性依赖于算法与密钥但是由于其算法复杂,而使得加密解密速度没有对称加密解密的速度快
3. 数据摘要
数据摘要(数据指纹),其基本原理是利用单向散列函数(Hash 函数)对信息进行运算,生成一串固定⻓度的数字摘要。
摘要特征:和加密算法的区别是,摘要严格意义不是加密,因为没有解密,只不过从摘要很难反推原信息,通常用来进行数据对比,来判断数据有没有被篡改。
摘要常见算法: 有 MD5、 SHA1、 SHA256、 SHA512 等,算法把无限的映射成有限,因此可能会有碰撞(两个不同的信息,算出的摘要相同,但是概率非常低)
4. 加密方案测试
4.1 只是用对称加密
只使用对称加密,首次的时候,双方无法同步密钥!不可靠
4.2 只使用非对称加密
由于公钥是公开的,因此别人可对服务器加密的信息进行解密,然后窃取数据,因此不可靠。
4.3 双方都使用非对称加密
这种方式貌似是安全的,但其实它和方案二从左向右是一样的,都是不安全的。
其次,都使用非对称加密,速度太慢了。
4.4 对称 + 非对称
此时,如果中间人在双方交换完对称密钥后,就无法窃取信息了。
如果中间人在双方握手前就来了,那会有什么结果呢?
对于方案2、3都存在该问题
所以,根本原因在于:客户端无法识别“服务器”发的公钥是不是“真的”
那如何让客户端识别呢?
5. 证书
5.1 数据签名
即:对数据摘要进行加密。
那谁来加密?签名者使用私钥加密(它是非对称加密,也有公钥、私钥)
此时,如果有人劫持了签名
- 它能使用签名者的公钥将签名解密查看,也能查看明文的数据
- 它无法对签名替换,因为如果替换了,它没有签名者的私钥,即使使用别的私钥加密了,验证时用签名者的公钥解不开,直接丢弃
- 它无法对明文传送的数据进行更改,因为更改以后,对数据做摘要形成的散列值就与原散列值不同了,验证时如果不同,直接丢弃。
所以,如果将服务端的公钥放到签名中,客户端就能知道,该公钥一定是真的,所以签名者至关重要!
那签名者是谁呢? - -CA机构
CA机构(Certificate Authority,证书颁发机构)是负责发放和管理数字证书的权威第三方机构,在公钥基础设施(PKI)中扮演核心角色
5.2 CA 证书
证书:含有证书申请者信息、申请者公钥信息等。 服务器把证书传输给浏览器,浏览器从证书里获取公钥就行了, 证书就如身份证,证明服务端公钥的权威性
服务端在使用 HTTPS 前 需要向 CA 机构申领一份数字证书
当服务端申请 CA 证书的时候,CA 机构会对该服务端进行审核,并专门为该网站形成数字签名,过程如下:
- CA 机构拥有非对称加密的私钥和公钥
- CA 机构对服务端申请的证书明文数据进行 hash, 形成数据摘要
- 然后对数据摘要用 CA 机构的私钥加密,得到数字签名 S,服务端申请的证书明文和数字签名 S 共同组成了数字证书,这样一份数字证书就可以颁发给服务端了
5.3 方案五 非对称加密 + 对称加密 + 证书认证
在客户端和服务器刚一建立连接的时候,服务器给客户端返回一个证书,证书包含了之前服务端的公钥,也包含了网站的身份信息
所有客户端都会内置CA机构的公钥
客户端进行认证
当客户端获取到这个证书之后,会对证书进行校验(防止证书是伪造的).
- 判定证书的有效期是否过期
- 判定证书的发布机构是否受信任(操作系统中已内置的受信任的证书发布机构)
- 验证证书是否被篡改:从系统中拿到该证书发布机构的公钥,对签名解密,得到数据摘要,设为 hash1。然后计算整个证书的 hash 值,设为 hash2。 对比 hash1 和 hash2 是否相等,如果相等, 则说明证书是没有被篡改过的。
中间人能不能整个掉包证书?
- 中间人没有 CA 私钥, 所以无法制作假的证书,
- 所以中间人只能向 CA 申请真证书,然后用自己申请的证书进行掉包;这个确实能做到证书的整体掉包,但是别忘记,证书明文中包含了域名等服务端认证信息,如果整体掉包,客户端依旧能够识别出来。
- 永远记住: 中间人没有 CA 私钥,所以对任何证书都无法进行合法修改,包括中间人自己申请的
总结:
HTTPS 工作过程中涉及到的密钥有三组(双非一对):
- 第一组非对称加密的密钥(CA机构的)是为了让客户端拿到第⼆组非对称加密的公钥
- 第⼆组非对称加密的密钥(服务器的)是为了让客户端把对称密钥传给服务器
- 第三组(对称加密):客户端和服务器后续传输的数据都通过这个对称密钥加密解密(加密/解密速度快)
常见问题
- 为什么摘要内容在网络传输的时候一定要加密形成签名?
如果中间人把数据篡改了,同时也把哈希值重新计算下,客户端就分辨不出来了。所以被传输的哈希值不能传输明文,需要传输密文。
- 为什么签名不直接加密, 而是要先 hash 形成摘要?
缩⼩签名密文的⻓度,加快数字签名的验证签名的运算速度