SHA512与Blowfish和Bcrypt

时间:2009-10-13 15:56:19

标签: security encryption passwords hash

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

  • Bcrypt使用Blowfish
  • Blowfish优于MD5
  • 问:但是Blowfish比SHA512好吗?

谢谢..

更新

我想澄清一点,我理解散列和加密之间的区别。是什么促使我以这种方式提出问题的是this article作者将bcrypt称为“自适应哈希”

由于bcrypt基于Blowfish,我被认为Blowfish是一种哈希算法。如果它的答案已经指出加密,那么在我看来它应该不会在本文中占有一席之地。更糟糕的是,他总结说bcrypt是最好的。 现在让我困惑的是phpass类(我相信用于密码哈希)使用bcrypt(即河豚,即加密)。根据这些新信息,你们告诉我(河豚是加密),这个类听起来不对。我错过了什么吗?

6 个答案:

答案 0 :(得分:312)

应该说bcrypt或SHA-512(在适当的算法如PBKDF2的上下文中)是否足够好。答案是肯定的,要么算法足够安全,要么通过实施缺陷而不是密码分析发生破坏。

如果你坚持知道哪个更好“,那么SHA-512已经得到了NIST和其他人的深入评论。这很好,但是已经认识到缺陷,虽然现在不可利用,但却引发了针对新哈希算法的SHA-3竞争。另外,请记住,哈希算法的研究比密码更新,密码学家仍然在学习它们。

尽管bcrypt作为一个整体并没有像Blowfish本身那么严格审查,但我相信基于具有良好理解结构的密码可以为基于哈希的身份验证提供一些固有的安全性。此外,使用通用GPU作为攻击基于SHA-2的哈希的工具更容易;由于其内存要求,优化bcrypt需要更专业的硬件,如FPGA和一些板载RAM。


注意:bcrypt是一种在内部使用Blowfish的算法。它本身不是加密算法。它被用于不可逆地模糊密码,就像哈希函数用于执行“单向哈希”一样。

加密哈希算法被设计为无法逆转。换句话说,只给出散列函数的输出,它应该“永远”地找到将产生相同散列输出的消息。实际上,找到产生相同散列值的任何两个消息在计算上是不可行的。与密码不同,哈希函数不用密钥参数化;相同的输入将始终产生相同的输出。

如果有人提供的密码与存储在密码表中的值进行哈希处理,则会对其进行身份验证。特别是,由于哈希函数的不可逆性,假设用户不是持有哈希的攻击者并将其反转以找到工作密码。

现在考虑一下bcrypt。它使用Blowfish来加密魔术字符串,使用密码中的“派生”密钥。之后,当用户输入密码时,再次导出密钥,并且如果通过使用该密钥加密产生的密文与存储的密文匹配,则对用户进行认证。密文存储在“密码”表中,但永远不会存储派生密钥。

为了打破密码,攻击者必须从密文中恢复密钥。这被称为“已知明文”攻击,因为攻击知道已加密的魔术字符串,但不知道使用的密钥。 Blowfish已被广泛研究,目前还没有任何攻击可以让攻击者用一个已知的明文找到密钥。

因此,就像基于加密摘要的不可逆算法一样,bcrypt会根据密码,盐和成本因素产生不可逆转的输出。它的优势在于Blowfish对已知明文攻击的抵抗力,这类似于摘要算法上的“第一次预映像攻击”。由于它可以用代替哈希算法来保护密码,因此bcrypt被混淆地称为“哈希”算法本身。

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

但是,如果摘要输出被“反馈”数千次,则需要数百年才能在该硬件上测试相同的密码集。 Bcrypt通过在其密钥派生例程中迭代来实现相同的“密钥强化”效果,并且像PBKDF2这样的适当的基于散列的方法也做同样的事情;在这方面,这两种方法是相似的。

所以,我对bcrypt的建议源于假设1)Blowfish与SHA-2系列哈希函数有相似程度的审查,2)密码的密码分析方法比哈希的密码分析方法更好功能

答案 1 :(得分:47)

我同意erickson的回答,但有一点需要注意:出于密码认证的目的,bcrypt 比SHA-512的单次迭代更好 - 仅仅因为它很远慢点。如果你不明白为什么慢速在这个特定的游戏中是一个优势,请阅读你再次链接的文章(向下滚动到“速度正是你不想要的密码哈希函数。 “)。

当然,您可以通过迭代数千次来围绕SHA-512构建安全密码哈希算法,就像PHK的MD5算法的工作方式一样。 Ulrich Drepper did exactly this,用于glibc的crypt()。但是,如果你已经有一个经过测试的bcrypt实现,那么没有特别的理由这样做。

答案 2 :(得分:29)

Blowfish不是哈希算法。这是一种加密算法。这意味着您可以使用blowfish加密某些内容,然后您可以将其解密回纯文本。

SHA512是一种散列算法。这意味着(理论上)一旦你对输入进行散列,你就无法再次获得原始输入。

它们是2种不同的东西,旨在用于不同的任务。没有'正确'的答案“比河豚更好吗?”您可能还要问“苹果比袋鼠好吗?”

如果你想在这里阅读更多关于这个主题的一些链接:

答案 3 :(得分:4)

Blowfish并不比MD5或SHA512好,因为它们有不同的用途。 MD5和SHA512是散列算法,Blowfish是一种加密算法。两种完全不同的加密函数。

答案 4 :(得分:2)

我建议使用Ulrich Drepper基于SHA-256 / SHA-512的加密实现。

我们将这些算法移植到Java,您可以在ftp://ftp.arlut.utexas.edu/java_hashes/找到它们的免费许可版本。

请注意,大多数现代(L)Unices在其/ etc / shadow文件中支持Drepper的算法。

答案 5 :(得分:2)

我刚看到这个:

http://codahale.com/how-to-safely-store-a-password/

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