简而言之,无论是bcrypt还是SHA-512(在适当的算法如PBKDF2的情况下),都足够安全。它们的安全性取决于实现的质量而非加密分析。
如果你坚持想知道哪个更好,那么需要注意的是,虽然SHA-512已经经过了NIST和其他机构的深入审查,但存在一些已被认识的缺陷,尽管目前不会被利用,但这导致了SHA-3算法竞赛的出现以寻找新的哈希算法。同时,需要记住的是,哈希算法的研究相对于密码学来说还比较“年轻”,因此密码学家们仍在学习中。
尽管bcrypt整体上没有像Blowfish本身那样受到那么多的审查,但我认为基于一个结构清晰的密码算法使其具有某些固有安全性,而哈希算法则缺乏这种安全性。此外,使用常见的GPU作为攻击SHA-2哈希的工具更容易;由于bcrypt的内存需求,优化bcrypt需要更多专业硬件的支持,例如带有一些板载RAM的FPGA。
注意:bcrypt是一种使用Blowfish算法的算法,它本身并不是加密算法。它用于使密码不可逆地混淆,就像哈希函数一样。
密码哈希算法的设计目的是无法逆转。换句话说,仅凭哈希函数的输出,找到一个能产生相同哈希输出的消息应该需要“永远”的时间。事实上,找到任何两个产生相同哈希值的消息都应该是计算上不可行的。与密码不同,哈希函数没有使用密钥进行参数化;相同的输入将始终产生相同的输出。
如果有人提供一个密码的哈希值与存储在密码表中的值匹配,那么他们就通过了身份验证。特别地,由于哈希函数的不可逆性,假设用户不是攻击者获取了哈希值并将其反转以找到有效密码。
现在考虑bcrypt。它使用Blowfish加密一个魔法字符串,使用从密码“派生”出的密钥。稍后,当用户输入密码时,密钥会再次派生,如果使用该密钥加密产生的密文与存储的密文匹配,则用户已经得到验证。密文存储在“密码”表中,但是派生出的密钥永远不会存储。
为了打破这里的密码学,攻击者必须从密文中恢复密钥。这被称为“已知明文”攻击,因为攻击者知道已经加密的魔法字符串,但不知道使用的密钥。Blowfish已经得到了广泛的研究,目前还没有已知的攻击方法可以允许攻击者通过单个已知明文找到密钥。
因此,就像基于密码摘要的不可逆算法一样,bcrypt从密码、盐和成本因素生成不可逆输出。它的强度在于Blowfish对已知明文攻击的抵抗力,类似于摘要算法上的“第一影像攻击”。由于它可以用作散列算法的替代品来保护密码,因此bcrypt被混淆地称为“散列”算法本身。
假设通过正确使用盐防止了彩虹表攻击,任何真正不可逆的函数都会将攻击者降低到试错。攻击者可以进行尝试的速率由不可逆“哈希”算法的速度决定。如果只使用哈希函数的单个迭代,攻击者可以使用约1000美元的设备每秒进行数百万次尝试,在几个月内测试所有长度为8字符的密码。
但是,如果摘要输出被“反馈”数千次,则使用该硬件在数百年内测试相同的密码集将需要很长时间。Bcrypt通过其密钥派生例程内部进行迭代来实现相同的“密钥加强”效果,而像PBKDF2这样的适当的基于哈希的方法也是如此;在这方面,这两种方法是类似的。
因此,我对bcrypt的推荐源自以下假设:1)Blowfish已经接受了与SHA-2哈希函数族相似的审查水平,2)密码学分析密码比摘要函数更好地发展。