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