【问题标题】:Is it ok to store password as pbkdf2 hash in database?可以将密码作为 pbkdf2 哈希存储在数据库中吗?
【发布时间】:2021-03-20 10:05:05
【问题描述】:

我需要将密码存储在数据库中。我在 Windows 上,该平台提供的唯一算法是 pbkdf2(据我所知)。那么可以将我的密码存储为 pbkdf2 的哈希值吗?或者他们是否可以通过 Windows API 获得更好的算法(Cryptography API 或 Windows 上可用的类似 api?)。我还了解到 PBKDF2+SHA512 与 BCrypt 没有太大区别

【问题讨论】:

  • 网络上有很多比较不同算法的帖子,包括 PBKDF2,例如here。如果您排除第三方,可能只剩下 PBKDF2(请参阅this answer 到您自己的问题)并且您必须接受缺点。
  • 现在主要推荐使用 Argon2。您应该更详细地描述您计划做什么以及您的要求是什么,例如可以通过 .NET 应用程序中的第三方库轻松使用 Argon2,例如here.
  • @Topaco : 我在 delphi 下,我不认为他们是 Delphi 下 Argon2 的任何实现:(

标签: encryption hash cryptography cryptoapi pbkdf2


【解决方案1】:

PBKDF2 确实是一个密码哈希,因此专为这种操作而设计。这并不意味着它没有任何缺点。像往常一样,它有一个盐和工作因子(比 PBKDF2 使用的 迭代计数 更通用的术语)。

但是它不提供任何内存硬度,因此更容易创建专门的硬件来攻击它。此外,智能实现可以通过执行预计算来加速用于指定哈希函数的 HMAC 算法。最后,如果您询问的位比散列函数的输出多,那么它的效率就会非常低 - 但如果您只是将其用作密码散列而不是(多)密钥推导,那么这并不是一个真正的主题。

所以 PBKDF2 是旧的,但它仍然比没有盐和/或工作因素的 hash(pasword)hash(salt | password) 的愚蠢数量好一百万倍。从字面上看,因为您至少会使用 1000000 作为迭代计数。


请注意,使用密码哈希仍然允许使用弱密码;您应始终尽可能添加其他措施,例如密码猜测限制,密码强度指标等等。它主要用于保护您的用户密码,以防登录数据库被盗。

【讨论】:

  • 注意内存硬scrypt是基于PBKDF2的,你可以看看是否可以从PBKDF2创建scrypt
  • 谢谢,但我想使用 Windows 中可用的 PBKDF2 实现。我不认为我可以在它之上构建 sCrypt 吗?
  • @lok​​i 我认为这应该是可能的,但我真的没有时间验证:|
  • 还是谢谢 :) 知道这很有趣!我需要找到一个 scrypt 的实现来看看我该怎么做
猜你喜欢
  • 2018-08-30
  • 2012-07-28
  • 2012-11-25
  • 2016-01-13
  • 2012-01-30
  • 1970-01-01
  • 2011-10-23
  • 2019-03-17
  • 2013-03-12
相关资源
最近更新 更多