只需说出bcrypt或SHA-512(在诸如PBKDF2之类的适当算法的上下文中)就足够了。答案是肯定的,任何一种算法都足够安全,以至于将通过实现缺陷(而不是密码分析)发生违规行为。
如果您坚持要知道哪个更好,则SHA-512已由NIST等人进行了深入的审查。很好,但是已经认识到的缺陷是,尽管现在无法利用,但它导致了SHA-3在新哈希算法方面的竞争。另外,请记住,对散列算法的研究比对密码的研究“新”,并且密码学家仍在学习它们。
尽管bcrypt整体上没有像Blowfish本身那样受到严格审查,但我相信,基于具有良好理解结构的密码,它可以提供基于哈希的身份验证所缺乏的某些固有安全性。同样,使用通用GPU作为攻击基于SHA-2的哈希的工具也更加容易。由于其内存需求,优化bcrypt要求更专业的硬件,例如带有板载RAM的FPGA。
注意:bcrypt是内部使用Blowfish的算法。它本身不是加密算法。它用于不可逆转地使密码模糊不清,就像使用哈希函数执行“单向哈希”一样。
密码哈希算法被设计为无法逆转。换句话说,仅给定散列函数的输出,应该花“永远”才能找到将产生相同散列输出的消息。实际上,找到产生相同哈希值的任何两个消息在计算上是不可行的。与密码不同,哈希函数不使用密钥进行参数化;相同的输入将始终产生相同的输出。
如果有人提供的密码散列到密码表中存储的值,则他们将通过身份验证。特别是,由于散列函数的不可逆性,我们假设用户不是持有散列并反转它以查找有效密码的攻击者。
现在考虑使用bcrypt。它使用Blowfish通过从密码“派生”的密钥来加密魔术字符串。以后,当用户输入密码时,将再次获得密钥,并且如果通过使用该密钥进行加密而生成的密文与存储的密文匹配,则将对用户进行身份验证。密文存储在“密码”表中,但从不存储派生密钥。
为了在这里破解密码,攻击者必须从密文中恢复密钥。这称为“已知明文”攻击,因为该攻击知道已加密的魔术字符串,但不知道所使用的密钥。河豚已被广泛研究,尚无攻击可让攻击者使用单个已知明文来查找密钥的攻击。
因此,就像基于加密摘要的不可逆算法一样,bcrypt会根据密码,盐和成本因素产生不可逆的输出。它的优势在于Blowfish对已知的纯文本攻击的抵抗力,这类似于摘要算法的“首次图像前攻击”。由于可以使用bcrypt 代替哈希算法来保护密码,因此bcrypt被混淆地称为“哈希”算法本身。
假设正确使用盐阻止了彩虹表,那么任何真正不可逆的功能都会使攻击者反复试验。攻击者可以进行试验的速度取决于该不可逆的“哈希”算法的速度。如果使用哈希函数的单个迭代,则攻击者可以使用成本约为1000美元的设备每秒进行数百万次尝试,并在几个月内测试所有密码,密码最长可包含8个字符。
但是,如果摘要输出被“反馈”数千次,则在该硬件上测试同一组密码将花费数百年的时间。Bcrypt通过在其密钥派生例程中进行迭代来实现相同的“密钥增强”效果,并且适当的基于哈希的方法(如PBKDF2)也可以做到这一点。在这方面,这两种方法是相似的。
因此,我对bcrypt的建议源于以下假设:1)Blowfish具有与SHA-2哈希函数家族类似的审查水平,以及2)密码的密码分析方法比哈希函数的密码分析方法更好。