如何正确地应用客户端密码哈希?

3
我正在寻找一个已经建立的安全机制,用于在客户端和服务器端密码散列之外应用客户端密码散列。客户端可以是Web应用程序或移动应用程序。客户端和服务器之间的通信使用HTTPS。服务器应该使用bcrypt或类似的安全密码散列算法。
现在,我不想发送未加密的密码从客户端到服务器,以防止针对用户的内部攻击。我希望确保我们的管理人员都无法获得原始密码,因为-正如我们所知道的那样-大多数人会重复使用他们的密码在多个网站上或使用密码方案来推导出易于记忆的密码。
此外,我想在身份验证协议中实施另一种额外的两因素安全层,该层利用存储在客户端上的秘密以进一步增强整体安全性。
是否有任何已发布和验证的机制可用于此情况?
编辑 在我的情况下,恶意管理员无法控制应用程序的代码。进行身份验证并提供敏感数据的服务器是REST服务器。应用程序代码由不同的服务器(对于Web应用程序)或通过AppStore(对于移动应用程序)交付。我还在考虑攻击者仅具有与连接HTTPS服务器和应用程序服务器的内部网络段的只读访问权限的情况。在大多数实际设置中,SSL终止是在专用服务器上完成的。

邪恶管理员控制客户端上的密码哈希代码。这行不通。 - Neil McGuigan
在尝试这样做时要非常小心。如果对用户输入进行哈希处理,可能会出现一些涉及空字节的问题。请参阅此文章以获取更多详细信息。http://blog.ircmaxell.com/2015/03/security-issue-combining-bcrypt-with.html - haxim
另请参阅:http://security.stackexchange.com/q/93395/8340 - SilverlightFox
1个回答

2
与网站不同,使用应用程序可以很好地进行客户端哈希。 应用程序已经包含计算哈希的代码,且该代码不可截取/更改,就像JavaScript一样。 更重要的是,您可以减轻服务器的CPU密集型计算。
以下是注册所需的步骤:
1. 在客户端使用成本因素的慢哈希函数计算密码的哈希值。适当的算法是BCrypt,PBKDF2或SCrypt。大多数库将自动生成随机盐并将其包含在生成的哈希值中。 2. 将客户端哈希发送到服务器(您已提到SSL连接)。 3. 在服务器端再次计算发送的客户端哈希的哈希值。这次不需要盐,并且可以使用快速算法(如SHA-256)。这是安全的,因为客户端哈希已经是一个非常强的“密码”,无法伪造客户端哈希。 4. 从客户端哈希中提取参数,如盐,成本因素和算法。 5. 将服务器哈希和参数(盐等)存储在数据库中。
以下是登录步骤:
1. 客户端必须请求在服务器上存储的参数(盐等)。 2. 客户端使用与注册相同的参数计算密码的哈希值。 3. 将客户端哈希发送到服务器。 4. 服务器再次使用快速算法对客户端哈希进行哈希,并将其与数据库中存储的哈希值进行比较。
这比仅进行服务器端哈希更复杂,因为您必须注意分别存储参数(盐等)。

谢谢您的回复。听起来很有道理。然而,我正在寻找已经发表并经过验证的机制。这个方案是您现在发明的吗?还是您有参考已经发表的论文或其他内容? - h2stein
@h2stein - 上面的答案并不是从“官方”来源复制的,而是我的个人知识。虽然我不是密码学家,但我对密码哈希问题有深入的了解,并已经撰写了一篇教程关于这个主题,也许这可以给你一个我花费无数小时研究这个问题的想法。所以它不仅仅是虚构的,但也不是官方来源。不幸的是,像crackstation这样的知名来源通常只涉及服务器端哈希。 - martinstoeckli
我接受这个答案,因为我觉得所提出的流程可以运行,并且似乎没有可以轻易找到的合适的出版物。 - h2stein

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接