前言
《Web协议详解与抓包实战》课程学习,陶辉老师主讲
学习内容:
- HTTP–TLS/SSL–TCP/IP自上而下根据应用学习web协议-TLS原理
- 结合抓包工具实践验证:chrome下的network面板、Tcpdump、Wireshark
TSL协议工作原理
TLS/SSL的功能实现主要依赖于三类基本算法:散列函数 Hash、对称加密和非对称加密,其利用非对称加密实现身份认证和密钥协商,对称加密算法采用协商的密钥对数据加密,基于散列函数验证信息的完整性。
设计目的:
- 身份验证
- 保密性
- 完整性
TLS协议内容:
- Record记录协议
- 对称加密
- Handshake握手协议
- 验证通讯双方的身份
- 交换加解密的安全套件
- 协商加密参数
TLS安全密钥套件
对阵加密的工作原理
AES对称加密在网络中的应用,相关概念主要见我另一篇文章web安全之密码学基础
对称加密的核心运算–XOR异或运算
填充padding
-
Block cipher分组加密:将明文分成多个等长的Block模块,对每个模块分别加解密
-
目的:当最后一个明文Block模块长度不足时,需要填充
-
填充方法:
对称加密的工作模式
ECB模式:电子密码本模式
Electronic codebook模式:
- 直接将明文分解为多个块,对每个块独立加密
- 问题:无法隐藏数据特征
CBC模式:密码分组链模式
Cipher-block chaining模式
- 每个明文块先于前一个密文块进行异或后,在进行加密
- 问题:加密过程串行化
CTR模式:计数器模式
Counter模式:
- 通过递增一个加密计数器以产生连续的密钥流
- 问题:不能提供密文消息完整性校验
密文消息完整性校验–【hash函数】
基于hash函数使用MAC(Message AUthentication Code)算法进行完整性验证
GCM模式
- Galois/Counter Mode
- 相当于CTR+GMAC
AES加密算法
Advanced Encryption Standard 高级加密标准算法
AES的三种密钥长度:
-
AES分组长度是128位(16字节)
-
密钥长度有三种
加密步骤:
加密流程:
- C = E(K, P)
- 其中C代表密文,E代表加密函数,P为明文,K为密钥
- 初始轮
- AddRoundKey 轮密钥加
- 普通轮
- SubBytes 字节替代
- ShiftRows 行移位
- MixColumns 列混合
- AddRoundKey 轮密钥加
- 最终轮
- SubBytes 字节替代
- ShiftRows 行移位
- AddRoundKey 轮密钥加
一轮中的4个操作阶段
这4分操作阶段使输入位得到充分的混淆,详细请参考AES加密算法的详细介绍与实现
SubBytes 字节替代
AES的字节代换其实就是一个简单的查表操作。AES定义了一个S盒和一个逆S盒。
AES的S盒:
行/列 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | A | B | C | D | E | F |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 0x63 | 0x7c | 0x77 | 0x7b | 0xf2 | 0x6b | 0x6f | 0xc5 | 0x30 | 0x01 | 0x67 | 0x2b | 0xfe | 0xd7 | 0xab | 0x76 |
1 | 0xca | 0x82 | 0xc9 | 0x7d | 0xfa | 0x59 | 0x47 | 0xf0 | 0xad | 0xd4 | 0xa2 | 0xaf | 0x9c | 0xa4 | 0x72 | 0xc0 |
2 | 0xb7 | 0xfd | 0x93 | 0x26 | 0x36 | 0x3f | 0xf7 | 0xcc | 0x34 | 0xa5 | 0xe5 | 0xf1 | 0x71 | 0xd8 | 0x31 | 0x15 |
3 | 0x04 | 0xc7 | 0x23 | 0xc3 | 0x18 | 0x96 | 0x05 | 0x9a | 0x07 | 0x12 | 0x80 | 0xe2 | 0xeb | 0x27 | 0xb2 | 0x75 |
4 | 0x09 | 0x83 | 0x2c | 0x1a | 0x1b | 0x6e | 0x5a | 0xa0 | 0x52 | 0x3b | 0xd6 | 0xb3 | 0x29 | 0xe3 | 0x2f | 0x84 |
5 | 0x53 | 0xd1 | 0x00 | 0xed | 0x20 | 0xfc | 0xb1 | 0x5b | 0x6a | 0xcb | 0xbe | 0x39 | 0x4a | 0x4c | 0x58 | 0xcf |
6 | 0xd0 | 0xef | 0xaa | 0xfb | 0x43 | 0x4d | 0x33 | 0x85 | 0x45 | 0xf9 | 0x02 | 0x7f | 0x50 | 0x3c | 0x9f | 0xa8 |
7 | 0x51 | 0xa3 | 0x40 | 0x8f | 0x92 | 0x9d | 0x38 | 0xf5 | 0xbc | 0xb6 | 0xda | 0x21 | 0x10 | 0xff | 0xf3 | 0xd2 |
8 | 0xcd | 0x0c | 0x13 | 0xec | 0x5f | 0x97 | 0x44 | 0x17 | 0xc4 | 0xa7 | 0x7e | 0x3d | 0x64 | 0x5d | 0x19 | 0x73 |
9 | 0x60 | 0x81 | 0x4f | 0xdc | 0x22 | 0x2a | 0x90 | 0x88 | 0x46 | 0xee | 0xb8 | 0x14 | 0xde | 0x5e | 0x0b | 0xdb |
A | 0xe0 | 0x32 | 0x3a | 0x0a | 0x49 | 0x06 | 0x24 | 0x5c | 0xc2 | 0xd3 | 0xac | 0x62 | 0x91 | 0x95 | 0xe4 | 0x79 |
B | 0xe7 | 0xc8 | 0x37 | 0x6d | 0x8d | 0xd5 | 0x4e | 0xa9 | 0x6c | 0x56 | 0xf4 | 0xea | 0x65 | 0x7a | 0xae | 0x08 |
C | 0xba | 0x78 | 0x25 | 0x2e | 0x1c | 0xa6 | 0xb4 | 0xc6 | 0xe8 | 0xdd | 0x74 | 0x1f | 0x4b | 0xbd | 0x8b | 0x8a |
D | 0x70 | 0x3e | 0xb5 | 0x66 | 0x48 | 0x03 | 0xf6 | 0x0e | 0x61 | 0x35 | 0x57 | 0xb9 | 0x86 | 0xc1 | 0x1d | 0x9e |
E | 0xe1 | 0xf8 | 0x98 | 0x11 | 0x69 | 0xd9 | 0x8e | 0x94 | 0x9b | 0x1e | 0x87 | 0xe9 | 0xce | 0x55 | 0x28 | 0xdf |
F | 0x8c | 0xa1 | 0x89 | 0x0d | 0xbf | 0xe6 | 0x42 | 0x68 | 0x41 | 0x99 | 0x2d | 0x0f | 0xb0 | 0x54 | 0xbb | 0x16 |
状态矩阵中的元素按照下面的规则映射为一个新的字节:把该字节的高4位作为行值,低4位作为列值,取出S盒或者逆S盒中对应的行的元素作为输出。例如,加密时,输出的字节S1为0x12,则查S盒的第0x01行和0x02列,得到值0xc9,然后替换S1原有的0x12为0xc9
同理,解密时的逆字节替换也有一个相应的逆S盒来进行查表映射
ShiftRows 行移位
将矩阵中的每个横列进行循环式移位
- 第一行不变
- 第二行循环左移1个字节
- 第三行循环左移2个字节
- 第四行循环左移3个字节
同理,逆行移位就是将状态矩阵中的每一行执行相反的移位操作(即右移操作)
MixColumns 列混合
列混合变换是通过矩阵相乘来实现的,利用的是线性代数的知识点,有兴趣可以深入了解
AddRoundKey 轮密钥加
密钥扩展
非对称加密
加密过程:
RSA算法
主要使用RSA算法来生成CA证书
openssl验证RSA
openssl genrsa -out private.pem # 生成私钥
openssl rsa -in private.pem -pubout -out public.pem # 从私钥中生成公钥
openssl asn1parse -i -in private.pem # 查看ASN.1格式的私钥
openssl rsautl -encrypt -in hello.txt -inkey public.pem -pubin -out hello.en # 使用RSA公钥加密
openssl rsautl -decrypt -in hello.en -inkey private.pem -out hello.de # 使用RSA私钥解密
- 生成私钥
- 从私钥中生成公钥
- 查看ASN.1格式的私钥
- 查看ASN.1格式的公钥
- 使用RSA进行加解密
非对称加密应用:PKI证书体系
数字签名的核心概念:基于私钥加密,只能使用公钥解密。这样拥有公钥的大家都知道某个消息是谁发出的,起到了身份认证的作用
由于RSA算法无法确保服务器身份的合法性,因为公钥并不包含服务器的信息,至少存在两类问题:中间人攻击和信息抵赖。
解决上述身份验证问题的关键是确保获取的公钥途径是合法的,能够验证服务器的身份信息,为此需要引入权威的第三方机构CA(如沃通CA)。CA 负责核实公钥的拥有者的信息,并颁发认证"证书",同时能够为使用者提供证书验证服务,即PKI体系(PKI基础知识)。
- 公钥的管理:Public Key Infrastructure(PKI) 公钥基础设施
- 由 Certificate Authority (CA)数字证书认证机构将用户个人身份信息与公钥关联在一起
- 公钥数字证书组成
- CA信息、公钥用户信息、公钥、权威机构的签字、证书有效期
- PKI用户
- 向CA核实公钥的用户
- 希望使用已核实公钥的用户
CA使用的具体流程:证书的签发和客户端的证书验证
证书信任链:服务器证书、中间证书与根证书在一起组合成一条合法的证书链,证书链的验证是自下而上的信任传递的过程。
PKI公钥基础设施
证书类型
非对称加密应用:DH密钥交换协议
-
RSA密钥交换
- 没有前向保密性的意思:若攻击者将双方通信报文全部保存,在将来的某一天将server的私钥解开,那就可以解密拿到双方通信的对称加密密钥,以此就可以解密双方之前所有的通信内容!!
为了解决这个问题,产生了DH密钥交换协议
-
DH密钥交换协议算法
核心原理:
密钥:
Alice(client) Bob(server) 公钥 g,p,A B 私钥 a b - 实例:
-
DH密钥交换协议存在的问题:
- 中间人伪造攻击
-
运算量非常大,运算速度慢
-
解决:使用ECDH密钥交换协议
- DH 依赖的是——求解“离散对数问题”的困难。
- ECDH 依赖的是——求解“椭圆曲线离散对数问题”的困难
-
关键原理:
-
ECDH步骤:
-
TLS1.2 通讯过程
我们通过通讯过程的流程图,结合www.sina.com.cn
抓包进行实践学习
-
Client Hello
-
Server Hello
3/4/5. Certificate, Server Key Exchange, Server Hello Done
-
Client Key Exchange, Change Cipher Spec, Finished
-
后续客户端和服务器双方生成共同的一个密钥利用对称加密算法来进行通信
通过上述演示,可以看到TLS1.2的加密套件非常多,其中有些套件比较古老,使用现在的算力完全可以轻易破解,因此出现了FREAK攻击
- 中间人通过篡改客户端支持的加密套件来进行攻击
- 高安全性的套件删除,迫使服务器选择安全性低的套件,来尝试破解密钥
-
TLS1.3的改进
- 直接全部使用安全性高的套件
握手的优化(TLS1.3)
-
Session resume session ID
- session缓存:以服务器生成的session ID为依据
-
Session resume with session ticket
- 由于session ID运行在内存中无法分享,反向代理到其他服务器还得重新握手建立密钥,所以产生了session ticket
-
TLS1.3的0RTT握手
- 建立在非首次请求中
结合三类算法的特点,TLS的基本工作方式是,客户端使用非对称加密与服务器进行通信,实现身份验证并协商对称加密使用的密钥,然后对称加密算法采用协商密钥对信息以及信息摘要进行加密通信,不同的节点之间采用的对称密钥不同,从而可以保证信息只能通信双方获取。