2021年水的第一篇文章
HTTP明文分段
TCP将HTTP明文分段,最大段取决于Min(MTU,MSS)
MTU:最大传输单元(Maximum Transmission Unit,MTU)用来通知对方所能接受数据服务单元的最大尺寸,主要取决于物理环境(光纤、路由器、交换机、服务器等)。
MSS:TCP(Maximum Segment Size,最大报文长度),一般1500字节。再减去IP与TCP头部各20字节,所以一般1460字节。
SMSS = Min(MTU,MSS)
SMSS就是报文最大段
对称加密
使用相同的密钥进行加密解密
对称加密是如何加密的
对明文的二进制以密钥进行异或操作。
密钥:0110 明文:1010 client serve 密文 = 明文 ⊕ 密钥 明文 = 密文 ⊕ 密钥 0110 0110 ⊕ ⊕ 1010 1100 = = 1100 1010复制代码
填充 padding会将明文以密钥长度分段,但是最后一段可能小于密钥长度,需要填充
位填充:以bit位填充
密文:1101 1111 0010 1010 1101 1111 0110
明文:1101 0111 1100 1101 0000 0000 0000
4位bit一组,不足4位补1其余补0
字节填充:以字节填充(以两个16字节为一组)
密钥:AA AA AA AA AA AA AA AA AA AA AA AA AA AA
补零:DD DD DD DD DD DD DD DD DD 00 00 00 00 00 使用00补齐
ANSI X9.23:DD DD DD DD DD DD DD DD DD 00 00 00 00 05 00补齐,最后一位一共补几个就是几
ISO 10126:DD DD DD DD DD DD DD DD DD 86 86 A1 33 05 随机补齐,最后一位一共补几个就是几
PKCS7 (RFC5652):DD DD DD DD DD DD DD DD DD 05 05 05 05 05 总共补齐个数,都使用这个个数填充
PKCS7 (RFC5652)是主流方法
实际应用的对称加密算法需要很快的运算速度,加密解密明文在网络环境中传递数据。
对称加密的加密算法
ECB模式
明文 ⊕ 密钥直接加密解密
优点:可并发,速度很快
缺点:数据特征明显,只是简单的异或很容易破解
SMSS =
对于图片的加密数据特征明显,最后一个才是我们想要的
ECB模式
简简单单,明文按照密钥长度分段。最后明文与密钥异或操作形成密文。
优点:可并发,速度快
缺点:数据特征明显,容易破解
CBC模式
1:明文分段
2:明文1与密钥异或加密生成密文1
3:密文1与明文2异或,再与密钥异或加密生成密文2
4:循环第三步,直至加密结束
优点:摸除了数据特征
缺点:串行执行,无法并发加密
CTR模式
使用一个计数器Counter与密钥key先异或,再与明文加密生成密文
优点:摸除数据特征,可并发
缺点:无法校验数据完整性
MAC
这不是个加密算法,但是解决了数据完整性
client serve 密文 密文 密钥 Hash算法 密文+MAC 密钥 Hash算法 MAC MAC(client)===MAC(serve)复制代码
密文+密钥使用Hash算法生成MAC,服务端同样对密文+密钥使用Hash算法生成MAC。最后进行比对就能确认数据文字性。
GCM模式
GCM=CTR+MAC组合
加密密文并行执行,计算MAC值会串行执行
iv:初始化向量,防止Hash碰撞发生
EK:对密钥与iv进行AES加密操作,使得每个明文的加密密钥都不同
Auth Data1:额外参数,端口号、IP地址等进一步保证数据安全性
mult(h):MAC算法加密
Tag:MAC操作后的标识
AES加密
三种不同密钥长度,加密轮数
AES-128加密步骤
1,把明文按128bit(16字节)拆分为多个明文块,每个明文块就是44的矩形(AES-192是66,AES-256是8*8)
2,按照上面介绍的字节填充填充方式填充最后一个明文块
3,每一个明文块利用AES加密器和密钥,加密为密文块
4,拼接所有密文块,形成最终密文
明文块加密
AddRoundKey 轮密加密
明文块a与密钥块k,进行异或XOR运算
密钥块k也不是原始秘钥而是经过秘钥扩展算法的
密钥扩展
1,将密文块以列的形式组合成一个字符w(每个4字节,总共16字节)
2,形成字符w0,w1,w2,w3
3, w3进行g函数操作得到w'
4,w'与w0进行XOR运算得到w4,w4与w1进行XOR运算得到w5...
5,得到一组新的密钥,在拆分成密钥块
g函数
1,把输入的w拆分B0,B1,B2,B3,每个4字节
2,左移操作B1,B2,B3,B0
3, S盒替换为B4,B5,B6,B7
4,RC(j),0,0,0与B4,B5,B6,B7对应XOR加密
RC根据j值数组中获取:{0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80,0x1B,0x36,}
5,输出w'
SubBytes 字节替换
将加密文块已行列位置与S盒中替换
ShiftRows 行位移
每行根据行数-1,向左移位字节
MixColumns 列混合
矩阵
0E 0B 0D 09 09 0E 0B 0D 0D 09 0E 0B 0B 0D 09 0E复制代码
每列与矩阵中对应列的相乘
好了对称加密的介绍完了,之后问题是如何将对称加密的密钥安全的传输给客户端。
加密套件和client-random、service-random 的传输过程却是明文的。黑客可以获得client-random和service-random在进行计算获得密钥,对密文传递进行解密。
非对称加密
发布公私钥,私钥服务器保留。私钥解密只有公钥能解,公钥加密只有私钥能解。
加密解密过程
我们来看RSA算法就能理解非对称加密是如何加密解密的
1,随机两个不相等的质数p和q 2,计算p和q的乘积n,明文长度小于n 3,计算n的欧拉函数v 4,随机一个整数k,1<k<v,且k与v互质 5,计算k对v的模反元素 6,公钥 (k,n) 7,私钥 (d,n) 1,p , q 2,n = p * q 3,v = (p - 1)*(q - 1) 4,gcd(k,v) = 1 5,(d * k) % v = 1 6,(k,n) 7,(d,n) 密文C = M^k mode n 明文M = C^d mode n复制代码
在传递时公钥 (k,n)明文传递。即使黑客获取也无法用k倒推,而n则是p和q的乘积。只要n足够大就有大量的因数分解,难以获取p和q。
向前安全
黑客可以大量保存你的数据包,当你的私钥被泄漏或破解时就可以对以往的数据进行解密。
这就有了ECDHE利用椭圆函数与离散对数进行计算临时密钥,哪怕密钥被攻破也只是一段时间内的数据包被解密。这样也就有了向前安全性
这块加密方式u1s1我没读懂,应该是我数学能力不够。
andrea.corbellini.name/2015/05/17/…
在RSA中可以看到非对称加密使用大量的乘法与mod取余运算,相比于对称加密的XOR运算对于大量数据来说是很耗时的。
混合加密
RSA混合加密
1,客户端生成Client Random随机数,将加密套件列表等数据发送给服务端 2,服务端生成Server Random随机数,将加密套件和数字证书发送给客户端 3,客户端校验证书,从中获取RSA私钥 4,随机生成pre-master随机数,利用RSA公钥加密发送给服务端。 黑客没有私钥无法解密改数据,也就无法获得pre-master随机数。 5,客户端与服务端利用pre-master、Client Random和Server Random生成对称加密所用的master sercret 6,用master sercret加密传递数据复制代码
ECDHE混合加密
1,客户端生成Client Random随机数,将加密套件列表等数据发送给服务端 2,服务端生成Server Random随机数和Server Params,将加密套件和数字证书发送给客户端 3,客户端校验证书,验证通过生成Client Params发送给服务端 4,用Server Params和Client Params通过ECDHE生成pre-master随机数。 5,客户端与服务端利用pre-master、Client Random和Server Random生成对称加密所用的master sercret 6,用master sercret加密传递数据复制代码
TLS1.3的变化
TLS1.3删除了许多不安全的算法
- 伪随机数函数由 PRF 升级为 HKDF(HMAC-based Extract-and-Expand Key Derivation Function);
- 明确禁止在记录协议里使用压缩;废除了 RC4、DES 对称加密算法;
- 废除了 ECB、CBC 等传统分组模式;废除了 MD5、SHA1、SHA-224 摘要算法;
- 废除了 RSA、DH 密钥交换算法和许多命名曲线。
删除的原因是中间人攻击,修改加密套件列表删除加密性强的加密方法只留下指定的加密方法。
同时也优化了ECDHE的握手速度,减少了2次RTT时间
除了标准的“1-RTT”握手,TLS1.3 还引入了“0-RTT”握手
1-RTT
session
保存当前master secret密钥信息在服务端,客户端保存session信息。当再次握手时通过校验服务端session信息是否存在,存在直接使用。
问题:负载均衡时确保所有服务器的session存储的一致,session存储在服务器中消耗内存
ticket
使用票据,服务端利用私钥加密密钥给客户端保存。当再次握手时传递ticket,服务端私钥解密ticket获得master secret。
所有服务器的秘钥基本能确保一直,且ticket由客户端存储。
0-RTT
ticket传递时同时添加http资源请求。
重放攻击
如果0-RTT的数据包被拦截了,黑客可以一直使用这个数据包,无需解密就能一直修改你服务器中的数据。
所以session、ticket和0-RTT都要设置一个合理的过期时间。
证书
有了这么复杂的加密算法为什么还需要CA证书。当黑客DNS污染,将IP地址引导到自己的服务器,那么后续操作都是在他的服务器上操作的,也就不存在破解加密算法的问题。
所有需要CA证书验证目标网络的正确性。
数字证书组成:CA信息、公钥信息、公钥、权威机构的数字签名、有效日期
- 校验有效日期
- 将CA信息用Hash生成Hash值,用CA机构的秘钥加密生成加密信息A。验证时将CA证书中的CA信息用相同的Hash生成Hash值,用CA的公钥解密加密信息A,对比两个哈希值是否相同
- CA证书中还有一个证书链,从Root CA、Issure CA、自身CA。Root CA内嵌与浏览器与操作系统中。
问题: 参考文档,建议按顺序阅读。