关于安全性:SHA512与Blowfish和Bcrypt

SHA512 vs. Blowfish and Bcrypt

我正在研究哈希算法,但找不到答案。

  • Bcrypt使用河豚
  • 河豚比MD5好
  • 问:但是河豚比沙512好吗?

谢谢。。

更新:

我想澄清一下,我理解散列和加密之间的区别。促使我这样问这个问题的是本文,作者将bcrypt称为"自适应散列"

因为bcrypt是基于河豚的,所以我认为河豚是一种哈希算法。如果答案指出它是加密的,那么在我看来,它不应该在本文中占有一席之地。更糟糕的是,他得出的结论是BCRYPT是最好的。现在让我困惑的是phpass类(我认为用于密码散列)使用bcrypt(即blowfish,即encryption)。根据你们告诉我的新信息(河豚是加密的),这个类听起来是错误的。我错过什么了吗?


它应该足以说明bcrypt或sha-512(在类似pbkdf2的适当算法的上下文中)是否足够好。答案是肯定的,这两种算法都足够安全,通过实现缺陷(而不是密码分析)会发生破坏。好的。

如果你坚持要知道哪个更好,sha-512已经得到了NIST和其他机构的深入审查。这很好,但缺陷已经被认识到,虽然现在不可开发,但导致了对新哈希算法的SHA-3竞争。另外,请记住,哈希算法的研究比密码算法的研究"新",而且密码学家仍在学习它们。好的。

尽管Bcrypt作为一个整体没有像河豚本身那样受到严格的审查,但我相信,基于一个具有良好理解结构的密码,可以给它一些基于哈希的认证所缺乏的固有安全性。此外,使用通用GPU作为攻击基于SHA-2–的哈希的工具更容易,因为它的内存需求,优化BCRYPT需要更专业的硬件,如带一些板载RAM的FPGA。好的。

注:bcrypt是一种在内部使用河豚的算法。它本身不是加密算法。它用于不可逆转地隐藏密码,就像哈希函数用于执行"单向哈希"一样。好的。

密码哈希算法被设计为不可能反转。换句话说,如果只给出哈希函数的输出,则需要"永远"才能找到将产生相同哈希输出的消息。事实上,找到任何两个产生相同哈希值的消息在计算上是不可行的。与密码不同,哈希函数不是用键参数化的;相同的输入总是产生相同的输出。好的。

如果有人提供的密码散列到密码表中存储的值,则会对其进行身份验证。特别是,由于哈希函数的不可逆性,假设用户不是一个获得哈希并将其颠倒以找到工作密码的攻击者。好的。

现在考虑Bcrypt。它使用Blowfish加密一个魔术字符串,使用一个从密码"派生"的密钥。稍后,当用户输入密码时,将再次派生密钥,如果用该密钥加密产生的密文与存储的密文匹配,则对用户进行身份验证。密文存储在"password"表中,但派生密钥从不存储。好的。

为了破解这里的密码,攻击者必须从密文中恢复密钥。这称为"已知明文"攻击,因为攻击知道已加密的魔法字符串,但不知道使用的密钥。人们对河豚进行了广泛的研究,目前还没有已知的攻击可以让攻击者通过一个已知的明文找到密钥。好的。

所以,就像基于不可逆算法的密码摘要一样,bcrypt通过密码、salt和成本因素生成不可逆的输出。它的优势在于河豚对已知明文攻击的抵抗力,这类似于对摘要算法的"第一次图像前攻击"。因为它可以用来代替哈希算法来保护密码,所以bcrypt被混淆地称为"哈希"算法本身。好的。

假设彩虹表被盐的正确使用所阻碍,任何真正不可逆的功能都会减少攻击者的尝试和错误。攻击者进行测试的速度取决于不可逆"散列"算法的速度。如果使用哈希函数的单次迭代,攻击者可以使用1000美元左右的设备每秒进行数百万次测试,在几个月内测试所有长达8个字符的密码。好的。

但是,如果摘要输出被"反馈"数千次,那么在该硬件上测试同一组密码将需要数百年的时间。Bcrypt通过在其密钥派生例程中迭代来实现相同的"密钥强化"效果,而适当的基于散列的方法(如pbkdf2)也可以实现相同的效果;在这方面,这两种方法是相似的。好的。

因此,我对bcrypt的建议源于以下假设:1)河豚具有与sha-2散列函数家族相似的详细程度;2)密码的密码学分析方法比散列函数的密码学分析方法开发得更好。好的。好啊。


我同意埃里克森的回答,但有一点需要注意:出于密码认证的目的,bcrypt比sha-512的单次迭代要好得多——这仅仅是因为它慢得多。如果你不明白为什么在这个特定的游戏中慢是一个优势,再次阅读你链接到的文章(向下滚动到"速度正是你不想要的密码散列函数。")。

当然,您可以通过对sha-512进行数千次迭代来构建一个安全的密码散列算法,就像phk的md5算法一样。ulrich drepper为glibc的crypt()做了这个。但是,如果您已经有了一个经过测试的BCrypt实现,那么这样做没有特别的原因。


河豚不是散列算法。这是一种加密算法。这意味着可以使用Blowfish加密某些内容,然后稍后可以将其解密回纯文本。

sha512是一种哈希算法。这意味着(理论上)一旦散列了输入,就不能再得到原始输入。

它们是两种不同的东西,设计用于不同的任务。对于"河豚比sha512好吗?",没有"正确"的答案。你不妨问"苹果比袋鼠好吗?"

如果您想了解更多有关此主题的信息,请访问以下链接:

  • 河豚
  • 沙512


河豚并不比MD5或SHA512更好,因为它们有不同的用途。MD5和SHA512是哈希算法,Blowfish是一种加密算法。两个完全不同的密码函数。


我刚发现这个:

http://codahale.com/how-to-safety-store-a-密码/

这篇文章的作者可能是错的吗?


我建议使用ulrich drepper的基于sha-256/sha-512的crypt实现。

我们将这些算法移植到Java,您可以在FTP://FTP.ARLUT.UTXA.EDU/JavaAHASH/中找到它们的免费授权版本。

请注意,大多数现代(L)unice在它们的/etc/shadow文件中都支持drepper的算法。