Bcrypt作为密钥派生函数?

信息安全 密码学 加密 密码 哈希
2021-09-01 12:54:19

我在堆栈交换中阅读了很多关于 bcrypt 的条目,以及为什么它在密码存储方面应该比 PBKDF2 更好

我现在在问 bcrypt 在密钥派生方面是否比 PBKDF2 更好?就我而言,我只需要为 AES 加密派生一个对称密钥(例如 256 位密钥长度)。不必保存此密钥,它仅用于即时加密。你有什么建议,在这种情况下 bcrypt 比 PBKDF2 更好吗?

干杯,坑

1个回答

Bcrypt 输出一个 192 位的结果,不多也不少。如果您想要一个长于 192 位的密钥,例如 256 位 AES 密钥,这很不方便。在这种情况下,我建议使用 bcrypt 输出并使用安全散列函数对其进行散列,该散列函数具有足够大的输出以满足所需的密钥材料长度(例如,如果您需要 256 位加密密钥128 位 MAC 密钥,请使用 SHA -384 或 SHA-512)。否则,就密钥派生而言,bcrypt 被认为是好的。

(从 192 位值生成 256 位加密密钥没有多大意义;但实际上使用 256 位 AES 而不是 128 位 AES 也没有多大意义。bcrypt 驱动的真正弱点无论如何,系统是密钥来自人类记住的密码;bcrypt 使这样的事情可以容忍,但远不如真正随机的 128 位密钥安全,更不用说 192 位或 256 位密钥了。如果您出于“管理原因”需要 256 位密钥,则从 bcrypt 输出和哈希函数生成该密钥不会产生额外的实际安全问题。)

Bcrypt 有一个小问题,如果您将 192 位 bcrypt 输出拆分为三个 64 位值,则在数学上可以保证这三个 64 位值彼此不同。因此,可以通过查看大约 2 64 个不同的 bcrypt 输出(对于随机 192 位值,可能会遇到块冲突——三个 64 位值中的两个)来区分 bcrypt的输出与随机预言机的输出彼此相等——经过平均 2 64 /3 个值)。这是一个非常轻微的偏差,对安全没有实际影响。