我正在研究哈希算法,但找不到答案。
Bcrypt使用Blowfish
Blowfish比MD5更好
问:河豚比SHA512好吗?
谢谢. .
更新:
我想澄清一下,我理解哈希和加密之间的区别。促使我以这种方式提出这个问题的是这篇文章,其中作者将bcrypt称为“自适应哈希”
Since bcrypt is based on Blowfish, I was led to think that Blowfish is a hashing algorithm. If it's encryption as answers have pointed out, then seems to me like it shouldn't have a place in this article. What's worse is that he's concluding that bcrypt is the best.
What's also confusing me now is that the phpass class (used for password hashing I believe) uses bcrypt (i.e. blowfish, i.e. encryption). Based on this new info you guys are telling me (blowfish is encryption), this class sounds wrong. Am I missing something?
这足以说明bcrypt或SHA-512(在PBKDF2等适当算法的上下文中)是否足够好。答案是肯定的,任何一种算法都足够安全,可以通过实现漏洞而不是密码分析来发生漏洞。
如果你坚持要知道哪个“更好”,SHA-512已经被NIST和其他人深入审查过。这很好,但是已经认识到缺陷,虽然现在还不能利用,但已经导致了SHA-3对新的哈希算法的竞争。此外,请记住,哈希算法的研究比密码的研究“更新”,密码学家仍在学习它们。
尽管bcrypt作为一个整体没有受到像Blowfish本身那样多的审查,但我认为基于一个具有良好理解结构的密码,使其具有一些基于哈希的身份验证所缺乏的固有安全性。此外,使用通用gpu作为攻击基于sha -2的哈希的工具更容易;由于其内存需求,优化bcrypt需要更专业的硬件,如FPGA和一些板载RAM。
注意:bcrypt是一个内部使用Blowfish的算法。它本身不是加密算法。它被用来不可逆地模糊密码,就像哈希函数被用来做“单向哈希”一样。
加密哈希算法被设计成不可能逆转的。换句话说,给定一个哈希函数的输出,它应该花“永远”才能找到产生相同哈希输出的消息。事实上,要找到产生相同哈希值的任何两条消息,在计算上应该是不可行的。与密码不同,哈希函数没有参数化的键;相同的输入总是会产生相同的输出。
如果有人提供了与密码表中存储的值散列的密码,则对他们进行身份验证。特别是,由于哈希函数的不可逆性,我们假设用户不是获得哈希并反向查找工作密码的攻击者。
现在考虑一下bcrypt。它使用Blowfish加密一个神奇的字符串,使用从密码“派生”出来的密钥。之后,当用户输入密码时,再次导出密钥,如果使用该密钥加密生成的密文与存储的密文相匹配,则验证用户的身份。密文存储在“password”表中,但派生的密钥永远不会存储。
为了破解这里的密码,攻击者必须从密文中恢复密钥。这被称为“已知明文”攻击,因为攻击者知道已加密的魔法字符串,但不知道使用的密钥。对Blowfish进行了广泛的研究,目前还没有一种攻击可以让攻击者通过一个已知的明文找到密钥。
因此,就像基于密码摘要的不可逆算法一样,bcrypt从密码、盐和成本因子中产生不可逆输出。它的优势在于Blowfish能够抵抗已知的明文攻击,这类似于摘要算法上的“第一次预图像攻击”。因为它可以代替哈希算法来保护密码,所以bcrypt本身被称为“哈希”算法。
假设彩虹表已经被正确使用的盐阻碍,任何真正不可逆的功能减少了攻击者的试错。而攻击者进行试验的速度是由不可逆的“哈希”算法的速度决定的。如果使用哈希函数的一次迭代,攻击者可以使用成本约为1000美元的设备每秒进行数百万次试验,在几个月内测试所有长达8个字符的密码。
然而,如果摘要输出被“反馈”数千次,那么在该硬件上测试同一组密码将需要数百年的时间。Bcrypt通过在其密钥派生例程中迭代来实现相同的“密钥强化”效果,而像PBKDF2这样适当的基于哈希的方法也可以做到同样的事情;在这方面,这两种方法是相似的。
因此,我对bcrypt的推荐源于以下假设:1)Blowfish与SHA-2哈希函数家族具有相似的审查水平,2)密码的密码分析方法比哈希函数的密码分析方法发展得更好。