实施安全远程密码:构建验证器

信息安全 密码 验证 密码学 哈希 密钥交换
2021-09-05 07:30:53

RFC 2945中描述的 SRP 协议生成密码验证器:

x = SHA(<salt> | SHA(<username> | ":" | <raw password>))`
v = g^x % N

我有三个问题:为什么要使用两次 SHA,为什么要涉及用户名以及为什么要添加分隔符?这些是否增加了任何实际的安全性x = SHA(<salt> | <raw password>)

2个回答

SHA-1 不是理想的散列函数(实际上,SHA-2 函数也不是)。双哈希调用隐藏了 SHA-1 的一些内部缺陷。这类似于HMAC,出于几乎相同的原因,它也使用双哈希调用。更详细地说,我们希望将用户名和密码映射到x(由盐在一系列函数中选择的函数)的函数表现得像随机预言机,以及散列函数的正常安全属性(抗碰撞、原像阻力)不足以保证这种行为。

涉及用户名是为了使安全证明更容易:它允许安全分析集中在单个用户上,而不必考虑给定服务器接受多个用户时会发生什么,每个用户都有自己的密码。分隔符参与相同的目标:否则,密码为“ny67dtzo”的“john”和密码为“67dtzo”的“johnny”将生活在同一个世界中,安全方面。

分隔符是一种很好的密码设计实践,无论何时将多个字符串输入散列函数。它有助于防止混淆,例如 username bob, passwordbydesign和 username bobby, password design

一般的设计原则是“在连接多个字符串时,在散列之前要小心”您可以在该链接中找到更详细的说明。过去违反此设计原则会导致缺陷,因此最好始终遵循设计原则,即使您想不出明显的攻击。