【问题标题】:BCrypt vs PBKDF2WithHmacSHA1 [closed]BCrypt vs PBKDF2WithHmacSHA1 [关闭]
【发布时间】:2014-12-06 08:20:06
【问题描述】:

为了安全地散列密码,我应该使用哪种算法? BCryptPBKDF2WithHmacSHA1?

哪个更安全? PBKDF2WithHmacSHA1 内置于 Java 中,而 BCrypt 可通过 jBCrypt 库获得(大部分都获得了正面评价)。

另外,如果我使用BCrypt,我是否应该将用户的密码输入限制为 55 个字符(因为这是BCrypt 的限制)?

如果您是 Java 特定的,那将会很有帮助。
请注意,我会选择使密码更安全且暴力破解更困难的选项。

【问题讨论】:

标签: java security bcrypt pbkdf2 jbcrypt


【解决方案1】:

它们不一样,也不是同样安全。

在 CPU 上,它们使用的资源量大致相同,并且在保护密码方面也大致相同。

问题归结为基于 GPU 的攻击。由于 GPU 的架构,bcrypt 实际上比 SHA1(或 SHA256)更难运行。因此,并行化 PBKDF2 + sha1 比并行化 bcrypt 更容易。

要添加一些实际数字,我们将从This presentation 中抽取。

Sha-1 比 md5 贵 3 倍左右。因此,如果我们查看慢速散列函数幻灯片,我们可以得出结论,md5crypt 比 pbkdf2-sha1 快约 3 倍。这是相当多的猜测,但它在我们正在寻找的边缘。

这意味着,对于同等 CPU 运行时,我们可以预期 PBKDF2-sha1 在 GPU 集群上每秒运行大约 2500 万次哈希。将其与每秒运行 75 千哈希的 BCrypt(成本为 5)进行比较。

这意味着 PBKDF2+sha1 在同等成本设置下比 bcrypt 弱约 1000 倍。

请注意,PBDFK2+sha512 几乎与 bcrypt 一样慢。这与使用 64 位操作的 SHA-512 (在当今的 GPU 中不是本机的)有关。

简而言之,bcrypt 比 PBKDF2+SHA1 安全几个数量级。它比 PBKDF2+SHA512 更安全,但差距不大。

这依赖于当今的 GPU 架构。将来,如果缓存大小和指令集发生显着变化,这些差异可能会消失。这就是为什么存在像 scrypt 这样的新算法的原因。

所以只需使用 bcrypt。 And don't worry about the character limit

【讨论】:

  • 感谢您的回答。我想问的是,它不会给用户(特别是那些使用非常长且熵非常低的密码的用户)一种虚假的安全感吗? Firstly,因为它没有使用用户提供的所有位。 Secondly,因为密码可以替换为前 72 个字符相同的任何其他密码。这意味着同一用户有多个密码。我了解您不提倡预散列,但您建议我在这种情况下应该怎么做?
  • 使用 sha-256 进行预散列会降低整体熵。对于低质量的长密码,这不是一个大问题。但对于复杂的,这是一个问题。在实践中,预散列可能没问题,但一定要使用 raw 输出(不是十六进制)。我只是更愿意公开推荐经过审查的算法,而不是编写我自己的算法。
  • 在这种情况下,如果我确实使用 SHA-512 对密码进行预散列(无盐,无胡椒),然后将原始输出传递给 BCrypt(12 轮),是否安全考虑到我的密码在不久的将来不会被破解?
  • 没有什么是安全的。关键是破解所有密码的工作量非常大,攻击者不值得继续这样做。
  • 非常感谢您的耐心和帮助。
【解决方案2】:

没关系。

他们两者的安全性差异不足以得出有意义的选择。但是,如果您正在寻找彻底的讨论,请查看 Eugene 的 cmets 中的两个链接

重要的是你正确地对待他们。

这意味着:

  • 选择正确的成本因数/迭代次数。如果你是彻底的,你会想要对你的服务器可以容忍的散列函数有多慢进行基准测试。越慢(=更高的成本因素/迭代次数)越好。为了给你一个大概的数字,我的全盘加密软件已经确定带有 HmacSHA1 的 PBKDF2 需要大约 10000 次迭代才能运行 50 毫秒。
  • 正确使用 salt:每个密码都需要一个随附的随机值 (salt),您将其存储在散列旁边并用作每个散列的输入。不要对每个密码都使用相同的盐,that would be pepper,这很好,但不能替代盐。
  • 以可升级的方式存储您的密码。稍后,您可能想要更改成本因子或添加胡椒值或将散列方案更改为 scrypt,一旦它被广泛接受。为此,数据库条目需要告知使用哪个参数选择来生成密码。例如,请参阅this commonly used unix passwords storage format

“另外,如果我使用 BCrypt,我是否应该将用户的密码输入限制为 55 个字符(因为这是 BCrypt 的限制)?”

没有。使用 SHA1 或 SHA256 对密码进行一次哈希处理,然后像之前使用密码一样使用输出。如果你想涂胡椒粉,这里就是最好的选择。最后,如果这听起来很麻烦,这可能是使用 PBKDF2 而不是 bcrypt 的决定因素。

【讨论】:

  • 如果我使用 SHA-512 对密码进行一次哈希处理,然后将原始输出(不是十六进制,因为它会减少熵)传递给 BCrypt 函数,那么认为我的密码不会是安全的吗?在不久的将来坏掉?
猜你喜欢
  • 2023-03-06
  • 2012-07-08
  • 2010-12-06
  • 2012-11-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-24
相关资源
最近更新 更多