【问题标题】:How to correctly apply client side hashing of passwords?如何正确应用密码的客户端散列?
【发布时间】:2015-10-21 22:59:55
【问题描述】:

除了服务器端密码散列之外,我正在寻找一种既定的安全机制来应用客户端密码散列。客户端是 Web 应用程序或移动应用程序。客户端和服务器之间的通信使用 HTTPS。服务器应使用 bcrypt 或类似的安全密码散列算法。

现在,我不想将未加密的密码从客户端发送到服务器,以防止对用户的内部攻击。我想确保我们的管理员都无法获得原始密码,因为 - 众所周知 - 大多数人在多个网站上重复使用他们的密码或使用密码方案来获取易于获取的密码记住。

此外,我想在身份验证协议中实施一个额外的两因素安全层,利用存储在客户端上的秘密,以进一步加强整体安全性。

是否有任何已发布和验证的机制可用于这种情况?

编辑 在我的场景中,邪恶的管理员无法控制应用程序的代码。进行身份验证并提供敏感数据的服务器是 REST 服务器。应用程序代码由不同的服务器(对于 Web 应用程序)或通过 AppStore(对于移动应用程序)交付。而且我也在考虑攻击者对连接HTTPS服务器和应用程序服务器的内部网段只有只读访问权限的场景。在大多数现实世界的设置中,SSL 终止是在专用服务器上完成的。

【问题讨论】:

标签: security hash passwords


【解决方案1】:

网站相比,您使用应用的场景非常适合客户端散列。该应用程序已经包含用于计算哈希的代码,并且无法拦截/更改代码,因为这将是 JavaScript 的情况。更重要的是,您可以将服务器从 CPU 密集型计算中解放出来。

这些是注册的必要步骤:

  1. 在客户端,使用带成本因子的慢速散列函数计算密码的散列。合适的算法是 BCrypt、PBKDF2 或 SCrypt。大多数库会自行生成随机盐并将其包含在生成的哈希值中。
  2. 将客户端哈希发送到服务器(您已经提到了 SSL 连接)。
  3. 在服务器端,再次计算发送的客户端散列的散列。这次你不需要盐,你可以使用像 SHA-256 这样的快速算法。这是安全的,因为客户端哈希已经是一个非常强大的“密码”,不可能从服务器哈希中伪造客户端哈希。
  4. 从客户端哈希中提取盐、成本因子和算法等参数。
  5. 将服务器哈希和参数(盐,...)存储在数据库中。

这些是登录步骤:

  1. 客户端必须请求存储在服务器数据库中的参数(盐、...)。
  2. 客户端使用与注册时相同的参数计算密码的哈希值。
  3. 将客户端哈希发送到服务器。
  4. 服务器再次使用快速算法对客户端哈希进行哈希处理,并将其与数据库中存储的哈希进行比较。

这比单独的服务器端哈希稍微复杂一些,因为您必须注意单独存储参数(盐,...)。

【讨论】:

  • 感谢您的回复。听起来很有道理。但是,我要求发布和验证机制。您是现在就发明了这个方案,还是参考了已发表的论文?
  • @h2stein - 上面的答案不是从“官方”来源复制的,这是我自己的知识。虽然我不是密码学家,但我对密码哈希问题有透彻的了解,并且已经写了一个关于这个主题的tutorial,也许这可以让你了解我在这件事上花费的无数小时。所以它不仅是发明的,也不是官方来源。不幸的是,像crackstation 这样成熟的来源通常只处理服务器端哈希。
  • 我接受这个答案,因为我觉得建议的过程会奏效,而且看起来没有合适的出版物可以轻松找到。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-12
  • 2021-02-19
  • 2015-10-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多