1
0
mirror of https://github.com/Snailclimb/JavaGuide synced 2025-07-20 03:13:00 +08:00
Java-Interview-Guide/docs/network/HTTPS中的TLS.md
2019-03-25 17:19:36 +08:00

137 lines
8.3 KiB
Java
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!-- TOC -->
- [1. SSL TLS](#1-ssl-%E4%B8%8E-tls)
- [2. 从网络协议的角度理解 HTTPS](#2-%E4%BB%8E%E7%BD%91%E7%BB%9C%E5%8D%8F%E8%AE%AE%E7%9A%84%E8%A7%92%E5%BA%A6%E7%90%86%E8%A7%A3-https)
- [3. 从密码学的角度理解 HTTPS](#3-%E4%BB%8E%E5%AF%86%E7%A0%81%E5%AD%A6%E7%9A%84%E8%A7%92%E5%BA%A6%E7%90%86%E8%A7%A3-https)
- [3.1. TLS 工作流程](#31-tls-%E5%B7%A5%E4%BD%9C%E6%B5%81%E7%A8%8B)
- [3.2. 密码基础](#32-%E5%AF%86%E7%A0%81%E5%9F%BA%E7%A1%80)
- [3.2.1. 伪随机数生成器](#321-%E4%BC%AA%E9%9A%8F%E6%9C%BA%E6%95%B0%E7%94%9F%E6%88%90%E5%99%A8)
- [3.2.2. 消息认证码](#322-%E6%B6%88%E6%81%AF%E8%AE%A4%E8%AF%81%E7%A0%81)
- [3.2.3. 数字签名](#323-%E6%95%B0%E5%AD%97%E7%AD%BE%E5%90%8D)
- [3.2.4. 公钥密码](#324-%E5%85%AC%E9%92%A5%E5%AF%86%E7%A0%81)
- [3.2.5. 证书](#325-%E8%AF%81%E4%B9%A6)
- [3.2.6. 密码小结](#326-%E5%AF%86%E7%A0%81%E5%B0%8F%E7%BB%93)
- [3.3. TLS 使用的密码技术](#33-tls-%E4%BD%BF%E7%94%A8%E7%9A%84%E5%AF%86%E7%A0%81%E6%8A%80%E6%9C%AF)
- [3.4. TLS 总结](#34-tls-%E6%80%BB%E7%BB%93)
- [4. RSA 简单示例](#4-rsa-%E7%AE%80%E5%8D%95%E7%A4%BA%E4%BE%8B)
- [5. 参考](#5-%E5%8F%82%E8%80%83)
<!-- TOC -->
# 1. SSL TLS
SSLSecure Socket Layer 安全套接层 1994 年由网景公司设计并于 1995 年发布了 3.0 版本
TLSTransport Layer Security传输层安全性协议 IETF SSL3.0 的基础上设计的协议
以下全部使用 TLS 来表示
# 2. 从网络协议的角度理解 HTTPS
![此图并不准确][1]
HTTPHyperText Transfer Protocol 超文本传输协议
HTTPSHypertext Transfer Protocol Secure 超文本传输安全协议
TLS位于 HTTP TCP 之间的协议其内部有 TLS握手协议TLS记录协议
HTTPS 经由 HTTP 进行通信但利用 TLS 来保证安全 HTTPS = HTTP + TLS
# 3. 从密码学的角度理解 HTTPS
HTTPS 使用 TLS 保证安全这里的安全分两部分一是传输内容加密二是服务端的身份认证
## 3.1. TLS 工作流程
![此图并不准确][2]
此为服务端单向认证还有客户端/服务端双向认证流程类似只不过客户端也有自己的证书并发送给服务器进行验证
## 3.2. 密码基础
### 3.2.1. 伪随机数生成器
为什么叫伪随机数因为没有真正意义上的随机数具体可以参考 Random/TheadLocalRandom
它的主要作用在于生成对称密码的秘钥用于公钥密码生成秘钥对
### 3.2.2. 消息认证码
消息认证码主要用于验证消息的完整性与消息的认证其中消息的认证指消息来自正确的发送者
>消息认证码用于验证和认证而不是加密
![消息认证码过程][3]
1. 发送者与接收者事先共享秘钥
2. 发送者根据发送消息计算 MAC
3. 发送者发送消息和 MAC
4. 接收者根据接收到的消息计算 MAC
5. 接收者根据自己计算的 MAC 值与收到的 MAC 对比
6. 如果对比成功说明消息完整并来自与正确的发送者
### 3.2.3. 数字签名
消息认证码的缺点在于**无法防止否认**因为共享秘钥被 clientserver 两端拥有server 可以伪造 client 发送给自己的消息自己给自己发送消息为了解决这个问题我们需要它们有各自的秘钥不被第二个知晓这样也解决了共享秘钥的配送问题
![数字签名过程][4]
>数字签名和消息认证码都**不是为了加密**
>可以将单向散列函数获取散列值的过程理解为使用 md5 摘要算法获取摘要的过程
使用自己的私钥对自己所认可的消息生成一个该消息专属的签名这就是数字签名表明我承认该消息来自自己
注意**私钥用于加签公钥用于解签每个人都可以解签查看消息的归属人**
### 3.2.4. 公钥密码
公钥密码也叫非对称密码由公钥和私钥组成它是最开始是为了解决秘钥的配送传输安全问题我们不配送私钥只配送公钥私钥由本人保管
它与数字签名相反公钥密码的私钥用于解密公钥用于加密每个人都可以用别人的公钥加密但只有对应的私钥才能解开密文
client明文 + 公钥 = 密文
server密文 + 私钥 = 明文
注意**公钥用于加密私钥用于解密只有私钥的归属者才能查看消息的真正内容**
### 3.2.5. 证书
证书全称公钥证书Public-Key Certificate, PKC,里面保存着归属者的基本信息以及证书过期时间归属者的公钥并由认证机构Certification Authority, **CA**施加数字签名表明某个认证机构认定该公钥的确属于此人
>想象这个场景你想在支付宝页面交易你需要支付宝的公钥进行加密通信于是你从百度上搜索关键字支付宝公钥你获得了支什宝的公钥这个时候支什宝通过中间人攻击让你访问到了他们支什宝的页面最后你在这个支什宝页面完美的使用了支什宝的公钥完成了与支什宝的交易
>![证书过程][5]
在上面的场景中你可以理解支付宝证书就是由支付宝的公钥和给支付宝颁发证书的企业的数字签名组成
任何人都可以给自己或别人的公钥添加自己的数字签名表明我拿我的尊严担保我的公钥/别人的公钥是真的至于信不信那是另一回事了
### 3.2.6. 密码小结
| 密码 | 作用 | 组成 |
| :-- | :-- | :-- |
| 消息认证码 | 确认消息的完整并对消息的来源认证 | 共享秘钥+消息的散列值 |
| 数字签名 | 对消息的散列值签名 | 公钥+私钥+消息的散列值 |
| 公钥密码 | 解决秘钥的配送问题 | 公钥+私钥+消息 |
| 证书 | 解决公钥的归属问题 | 公钥密码中的公钥+数字签名 |
## 3.3. TLS 使用的密码技术
1. 伪随机数生成器秘钥生成随机性更难被猜测
2. 对称密码对称密码使用的秘钥就是由伪随机数生成相较于非对称密码效率更高
3. 消息认证码保证消息信息的完整性以及验证消息信息的来源
4. 公钥密码证书技术使用的就是公钥密码
5. 数字签名验证证书的签名确定由真实的某个 CA 颁发
6. 证书解决公钥的真实归属问题降低中间人攻击概率
## 3.4. TLS 总结
TLS 是一系列密码工具的框架作为框架它也是非常的灵活体现在每个工具套件它都可以替换客户端与服务端之间协商密码套件从而更难的被攻破例如使用不同方式的对称密码或者公钥密码数字签名生成方式单向散列函数技术的替换等
# 4. RSA 简单示例
RSA 是一种公钥密码算法我们简单的走一遍它的加密解密过程
加密算法密文 = (明文^E) mod N其中公钥为{E,N}求明文的E次方的对 N 的余数
解密算法明文 = (密文^D) mod N其中秘钥为{D,N}求密文的D次方的对 N 的余数
我们已知公钥为{5,323}私钥为{29,323}明文为300请写出加密和解密的过程
>加密密文 = 123 ^ 5 mod 323 = 225
>解密明文 = 225 ^ 29 mod 323 = [[(225 ^ 5) mod 323] * [(225 ^ 5) mod 323] * [(225 ^ 5) mod 323] * [(225 ^ 5) mod 323] * [(225 ^ 5) mod 323] * [(225 ^ 4) mod 323]] mod 323 = (4 * 4 * 4 * 4 * 4 * 290) mod 323 = 123
# 5. 参考
1. SSL加密发生在哪里<https://security.stackexchange.com/questions/19681/where-does-ssl-encryption-take-place>
2. TLS工作流程<https://blog.csdn.net/ustccw/article/details/76691248>
3. 图解密码技术<https://book.douban.com/subject/26822106/> 豆瓣评分 9.5
[1]: https://leran2deeplearnjavawebtech.oss-cn-beijing.aliyuncs.com/somephoto/%E4%B8%83%E5%B1%82.png
[2]: https://leran2deeplearnjavawebtech.oss-cn-beijing.aliyuncs.com/somephoto/tls%E6%B5%81%E7%A8%8B.png
[3]: https://leran2deeplearnjavawebtech.oss-cn-beijing.aliyuncs.com/somephoto/%E6%B6%88%E6%81%AF%E8%AE%A4%E8%AF%81%E7%A0%81%E8%BF%87%E7%A8%8B.png
[4]: https://leran2deeplearnjavawebtech.oss-cn-beijing.aliyuncs.com/somephoto/%E6%95%B0%E5%AD%97%E7%AD%BE%E5%90%8D%E8%BF%87%E7%A8%8B.png
[5]: https://leran2deeplearnjavawebtech.oss-cn-beijing.aliyuncs.com/somephoto/dns%E4%B8%AD%E9%97%B4%E4%BA%BA%E6%94%BB%E5%87%BB.png