编辑:更新以更加强调目标 - 让用户安心,而不是加强安全性。
在阅读了这里关于客户端密码散列的一些讨论之后,我仍然想知道在特定情况下使用它是否可以。
具体来说,我想让客户端 - 一个 Java 程序 - 使用 PBKDF2 之类的东西对他们的密码进行哈希处理,使用他们的电子邮件地址和特定于应用程序的常量字节块的组合作为盐。这个想法是散列可用于身份验证,但希望不会受到逆向工程攻击(以发现文字密码),而不是在服务器数据受到破坏时使用暴力破解。
目标:
客户端散列是为了让用户放心,服务器永远不会收到他们的文字密码,即使有保证在存储中对其进行散列也是如此。另一个好处(或者可能是一个责任?)是迭代的 PBKDF2 或类似的散列成本取决于客户端。
环境特征是:
- 所有客户端-服务器通信都是加密的。
- 不允许重播消息。IE。从客户端发送的哈希不能被窃听者有效地用作密码。
- 对于在短时间内多次登录失败的尝试,临时禁止和黑名单 IP 是可能的。这可能是每个用户帐户或系统范围内的。
关注点:
- “避免设计自制的身份验证方案。”
- salt 对于每个用户都是确定性的,即使生成的哈希将特定于该应用程序,因为将(相同的)额外字节放入 salt 中。这很糟糕吗?
- 服务器端的身份验证不会有任何明显的延迟,也不会产生散列成本。这是否会增加分布式暴力验证攻击的脆弱性?
- 流氓客户可以为他们自己的账户提供一个弱散列。其实,也不必太担心这个。
- 服务器是否应该在存储之前重新散列客户端散列?
想法?