一起使用 Bcrypt 和 PBKDF2 有意义吗?

信息安全 密码 哈希 密钥生成 bcrypt pbkdf2
2021-08-27 11:09:53

我已经阅读了关于 Bcrypt 或 PDBKF2 是否是更好的密钥派生散列方法的各种意见。答案似乎取决于很多不容易分析的复杂因素。是否会同时使用它们(可能以串行方式一个在另一个之前)累积两者的好处,从而实现最佳安全解决方案?

1个回答

混合这两个功能并没有真正的帮助。Bcrypt 和 PBKDF2 都具有可配置的成本:您应该将迭代次数设置为在您的情况下仍然可以容忍的最大值,考虑到可用的硬件和环境限制(例如平均用户耐心)。如果你想同时使用这两个功能,那么它们必须共享相同的 CPU 预算;换句话说,与单独在任一函数中使用的迭代次数相比,您将不得不减少迭代次数。

因此,您不会以这种方式获得更强大的东西;相反,您获得的安全级别是单独使用 Bcrypt 或单独使用 PBKDF2 可获得的平均安全级别。

将两个散列函数或类似函数组合在一起可以很好地避免灾难性故障,如果一个结果被破坏;但是,假设 Bcrypt 和 PBKDF2 都很强大,问题主要是关于性能的(bcrypt 和 PBKDF2 都是为了让穷举搜索变慢,所以这都是关于性能的)。为了获得最佳的慢度,结合 bcrypt 和 PBKDF2并不是一个好主意。

对于 bcrypt 和 PBKDF2 之间的选择,请参阅这个先前的答案总结一下:

  • 如果您的硬件类似于 PC(即有几千字节的 RAM 并且可以快速访问),那么 Bcrypt 会更好。与 PBKDF2 相比,如果使用 bcrypt,攻击者更难使用 GPU 优化穷举搜索。

  • PBKDF2 有 NIST 的祝福(它已获得批准,带有一个大“A”)。NIST 对 bcrypt 只字未提。

  • Bcrypt 输出 192 位,这对于密码验证令牌来说很好,或者如果您只需要 192 位(或更少)的密码派生密钥材料。另一方面,PBKDF2 是一个密钥派生函数,可以生成任意多的位,如果您需要超过 192 位的密钥材料,这很好。