为了让客户端和服务器互相证明他们拥有相同的 premaster 共享密钥,原作者建议这样做:
M = H(A | B | K) -->
<-- H(A | M | K)
RFC 2945建议这样做:
M = H(H(N) XOR H(g) | H(U) | s | A | B | K) -->
<-- H(A | M | K)
这些串联中有多少实际上提高了安全性?另外,在不降低安全性的情况下,我有多少自由来改变它?例如,我想用连接替换 XOR 会同样安全。
- A - 公开的,每次随机,由客户端决定
- B - public,每次随机,由服务器决定
- U - 在我的实现中是私有的,用户名(盐渍哈希和盐是公共的)
- s - public,与用户帐户密码相关联,由服务器确定
- N 和 g - 公共,常量,由程序员确定
- K - 私有,每次随机,服务器和客户端之间的密钥
我应该使用哪个定义?两者的区别在于,更多由服务器确定的公共值被连接到第二个哈希中。这真的值得吗,因为任何攻击者都知道H(N) XOR H(g) | H(U) | s | A | B吗A | B?
编辑:大写 U 实际上是用户名。我把它读成小写。显然 C# 的大小写敏感性并不大。