具有扩展主密钥时SSL/TLS的主密钥计算

具有扩展主密钥时SSL/TLS的主密钥计算

梦之痕bhl 2020-02-19 17:12:28 

https://blog.csdn.net/laing92?t=1


简介
最近在基于openssl1.0.2t源码做开发,解密TLS1.2数据包,出现部分数据包解密失败的问题,通过定位发现,不同的HTTPS服务器,在客户端与服务端协商时部分扩展字段有差异,导致计算密钥失败或错误,其中关于“Extended Master Secret Extension”,如果协商时具有此扩展字段,计算主密钥的方式会有所差异,具体对此字段的解释,详见RFC7627

TLS密钥计算流程
无“Extended Master Secret”
在TLS中,每个会话都有一个“master_secret”,其计算方式如下:

master_secret = PRF(pre_master_secret,“主密码”,
ClientHello.random + ServerHello.random)
[0..47];
1
2
3
其中“pre_master_secret”是某些密钥交换的结果协议。例如,当握手使用RSA密码套件时,该值是由客户端均匀随机生成的。

具有“Extended Master Secret”
全面协商扩展主密钥后,握手时,“master_secret”的计算公式为:

master_secret = PRF(pre_master_secret,“扩展的主密钥”,
session_hash)
[0..47];
1
2
3
其中的session_hash的定义如下:

session_hash = 哈希(handshake_messages)
1
其中“handshake_messages”是指所有已发送的握手消息,或者从ClientHello开始,直至并包ClientKeyExchange消息,包括以下内容的类型和长度字段握手消息。

三重握手
三重握手(Triple Handshake) (CVE-2014-1295):攻击者(A)分别与客户端(C)和服务器(S)握手,协商出同一个主密钥;之后令客户端(C)和服务器(S)之间重新协商(renegotiation)或继续(resumption)会话来握手。可攻破重新协商,TLS Exporter RFC5705和"tls-unique" RFC5929。

具体握手过程
C:客户端。 A: 攻击者 S:服务端

C向A发送“ ClientHello”,A将其转发给S。

S向A发送“ ServerHello”,A将其转发给C。

S将包含其证书链的“证书”发送给A。
A用自己的证书链替换它,并将其发送给C。

S向A发送“ ServerHelloDone”,A将其转发给C。

C向A发送“ ClientKeyExchange”,其中包含
“ pre_master_secret”,已使用A的公钥加密。解密
“ pre_master_secret”,使用S的公钥对其重新加密,并且
将其发送给S。

C向A发送“完成”。A计算其“完成”
与S连接并将其发送给S。

S向A发送“完成”。A计算其“完成”
与C的连接,并将其发送给C。

通过以上方式,如果使用无“Extended Master Secret”扩展字段的计算方式将发现,从C->A和从A->S之间使用的会话密钥是一样的,这种叫做未知密钥共享(unkown key-share(UKS))攻击。当使用

master_secret = PRF(pre_master_secret,“扩展的主密钥”,
session_hash)
[0..47];
1
2
3
的计算方式时,因为有session_hash,计算了所有协商消息的hash,如果中间攻击者A对协商消息进行改动,则客户端和服务端计算的hash值则不一样,最后计算出的主密钥也会不同。

参考资料
https://tools.ietf.org/html/rfc7627
https://forum.nginx.org/read.php?2,272703,272704
————————————————
版权声明:本文为CSDN博主「梦之痕bhl」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/laing92/article/details/104396530

猜你喜欢

转载自www.cnblogs.com/bigben0123/p/12890869.html