看到这个标题,很多老铁会坚钉截铁地说,我会!HTTPS 安全传输。
对,很优秀,那你知道 HTTPS 底层是如何保证数据的安全性的我们今天的主题介绍:HTTPS 如何实现数据安全传输。
HTTPS 认知
HTTPS 其实是 HTTP SSL 由协议组成的安全协议。
我们知道,从我们输入 URL 到页面呈现的过程是作用于 HTTP 协议的,HTTP 协议保证了我们网络传输数据的基础,但不能保证安全, SSL 协议作用于 Http 协议可以解决安全问题。
HTTPS 保证以下三点:
- 加密数据内容
- 数据完整性保护(数字摘要、数字签名)
- 身份认证
- 握手阶段: 公钥 采用非对称加密技术
- 传输阶段:使用 对称加密技术 加密
握手阶段确保连接安全,后续数据传输可数据传输可以安全传输,因此可以使用较少的对称加密算法来加密报纸。
HTTPS 解构:
在上图中,我们可以看到 SSL 协议的作用是了解 ,以确保数据安全SSL 协议前,我们先了解一些关于数据安全的概念。
加解密相关概念
1. 对称加密
别名: 私钥加密、单密钥算法、传统密码算法。
概念: 指使用 相同的密钥 进行加密解密,因此可以从加密钥或解密钥计算加密钥。
常用的对称加密算法: DES(Data Encryption Standard)、AES(Advanced Encryption Standard)、RC4、IDEA
2. 不对称加密
别名: 公钥加密
概念: 公钥是公开的,私钥存储在通信两端的手中。客户端与加密公钥形成一对密钥对, 服务端与加密公钥形成另一对密钥对,解密密钥成对
限制: 加密内容的长度不得超过公钥的长度
3. 数字摘要
别名: 数字指纹
概念: 明文采用单项 Hash 函数产生的一串固定长度(128 位)的密文。
4. 数字签名
概念:混合应用非对称密钥加密技术和数字摘要
(1) 数字签名过程
- 用于发送者Hash 函数 (H) 将原文生成数字摘要 A
- 发送者使用自己的私钥对数字进行摘要 A 加密生成密文 CypherA
- 将密文 CypherA 与原文一起传送给接收者
- 接收者使用 Hash 函数 (H) 将收到的原文生成数字摘要 B (B === A,H 函数相同)
- 接收者使用公钥对接收到的加密文章 (CypherA) 解密,获得数字摘要 B'
- 对比 B' 与 B 是否相等, 如果相等,则表示收到的信息是完整的,信息确实由发送方签名并发送(因为只有发送方知道私钥),在传输过程中未修改;否则,信息将被修改
最后比较数字摘要 A 数字摘要 A是否相等,也可逆向使用 Hash()函数,摘要 A还原得到明文,比较明文是否与传来的原文一致(都是 pig)。
数字签名是一个加密过程,数字签名验证 是一个解密过程。数字签名涉及哈希函数、接收人公钥和发送人[私钥]。
(3) 伪代码
在上述数字签名过程中,如何保证公钥可靠?这就是数字证书存在的必要性。
数字证书主要用于加密、签名和身份认证。
证书颁发机构数字证书(CA,Certification Agent) 颁发,CA 在颁发证书和使用证书前验证持有人的身份,使客户能够识别公钥是否来自合法服务器。
证书颁发机构(CA) 颁发包含公钥和所有者身份的数字证书。匹配的私钥不是公开的,而是由生成密钥的最终用户保密的。证书或 CA 确认或验证证书中包含的公钥属于证书中标注的个人、组织、服务器或其他实体。CA 此类方案的义务是验证申请人的凭证,使用户和信任方能够信任 CA 证书中的信息。
当您访问使用 HTTPS(安全连接)网站时,网站服务器将向浏览器(如 Chrome)证明网站的身份。证书中包含的公钥信息是可靠的。 如果证书不存在,证书被篡改,证书无效,浏览器会提示您的网站在左上角不安全。
签名验证链:client <- 服务器 <- CA
数字证书内容:
- 证书颁发机构的名称
- 证书本身的数字签名
- 证书持有者公钥
- 用于签名证书Hash 算法
- ... 等等
公钥和数字签名
在理解了这些基本概念之后,进入我们今天的主题:SSL 协议如何保证数据的安全传输。
SSL/TLS
1. SSL(Secure Socket Layer,安全套接字层)
在网络传输过程中,使用加密技术确保数据不会被盗。
2. TLS (Transport Layer Security,传输层安全协议)
在两个应用程序之间提供保密性和数据完整性。
该协议以 为基础SSL3.0 在协议的基础上,可以理解为 SSL3.1 版本。就在 SSL3.0 在使数据更安全的基础上,采用了一些更安全的策略。其他协议分层和功能 SSL 一致。如果你感兴趣,你可以自己了解它和 SSL 的区别和优点。
SSL/TLS 协议的作用:
- 数据加密,防止被盗
- 保护数据的完整性,确保数据不会改变
- 身份认证,确保数据发送到正确的客户端和服务器
那么,SSL 协议如何加密我们的数据以安全传输?
3. SSL、TLS 握手过程
(1) 客户端通知服务端支持的 安全协议版本(如 TLS1.0)、加密算法、压缩方法、随机数 CRandom1;
(2) 服务端首次响应,返回版本、加密算法、压缩方法、随机数 安全协议SRandom,还有 数字证书(服务器证书);
(3)客户端对服务端发送的证书进行验证,验证后进行以下操作:
- 客户端再次产生随机数 CRandom2
- 使用服务器证书中的公钥对数据进行进行加密,生成随机数 CRandom3
- 发送 ChangeCipherSpec(编码变更)消息通知(通知服务器,我已经准备好用我们之前讨论过的加密套件加密并传输数据) ,所有消息的 hash 和 加密数据 CRandom3 服务器验证
- 使用与服务器确认的加密算法 CRandom1、CRandom2、CRandom3 加密三个随机数,生成 Session Secret(这是使用对称加密算法传输数据时使用的对称加密密钥,也可用于 会话恢复,节省 SSL 的握手时间)
- 用自己的私钥对 CRandom3 解密并验证解密数据
- 发送 ChangeCipherSpec(编码变更)消息通知(通知客户端,我也准备好使用我们之前讨论过的加密套件和 Session Secret 加密数据)
- 使用 Session Secret 加密一段 Finish 消息发送给客户端,验证之前握手建立的加解密通道是否成功
握手过程结束了。
整个握手阶段的安全取决于第三个随机数 CRandom3 是否可以破解,因为这个随机数是由服务端的公钥和服务端的私钥加密的;私钥只存储在服务端本身。
对称加密技术可用于在所有握手阶段完成后传输应用数据。
QA
1. 客户端如何验证收到的证书?
证书本身已经告诉客户如何验证证书的真实性。也就是说,证书上写着如何根据证书的内容生成证书编号。客户端获得证书后,根据证书上的方法生成证书编号。如果生成的证书编号与证书上的证书编号相同,则表明证书是真实的。
2. 公钥的安全性是通过证书确认的,但证书是由发证机构颁发的。如何确认发证人是可信的?
通过证书链。
- root:权威证书认证机构 (CA,Certificate Authority) 给自己颁发的数字证书,也就是认证自己。上图中的根证是 DigiCert Global Root CA 自己给自己签发的。
- intermediates:中间证,根 CA 生成一对公钥和私钥,中间 用私钥CA 信息和公钥 “加密” 生成签名,包装获得中间证书。需要注意的是,中间 CA 可能不止一个。CA 也按照这个逻辑给下一级 CA 签发证书。CA 就是 RapidSSL RSA CA 2018年,它向终端用户签发证书。
- end-user:终端用户(证书)。图中的终端证书是 *.juejin.im 使用的数字证书。
总结
网络安全传输数据依赖 SSL 协议,网络传输协议是 HTTP,因此构成 HTTPS 协议HTTPS 为了确保客户端和服务器端的高效通信安全,必须使用对称加密算法,但协商对称加密算法的过程,需要使用不对称加密算法来确保安全,但直接使用不对称加密过程本身不安全,中间人可能篡改公钥,因此客户端和服务器不直接使用公钥,而是使用数字证书签发机构颁发的证书,以确保不对称加密过程本身的安全。
这样通过这些机制协商出一个对称加密算法,就此双方使用该算法对数据进行加密解密传输,从而解决了客户端与服务器端之间的通信安全问题。