SHA512与Blowfish和Bcrypt的比较

234

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

  • Bcrypt使用Blowfish
  • Blowfish比MD5更好
  • 问:但Blowfish是否比SHA512更好?

谢谢..

更新:

我想澄清一下,我理解哈希和加密之间的区别。我这样问问题的原因是这篇文章作者将bcrypt称为“自适应哈希”

由于bcrypt基于Blowfish,我认为Blowfish是哈希算法。如果它是加密,就像其他回答所指出的那样,似乎它不应该出现在这篇文章中。更糟糕的是,作者得出结论,bcrypt是最好的。现在让我困惑的另一个问题是phpass类(我相信用于密码哈希)使用bcrypt(即blowfish,即加密)。根据你们提供的新信息(blowfish是加密),这个类听起来就有问题了。我错过了什么吗?


2
这并不是错误的;请查看我的答案更新,了解bcrypt的工作原理以及为什么它与基于哈希的“单向”算法具有相同的目的。 - erickson
3
“bcrypt”默认具有更高的“工作因子”。 SHA则被认为没有…除非使用passhash9,该程序可以使用其中任意一个,并带有一定的工作因子。为什么这个问题关闭了?它还远未得到解答,非常重要。 - user1382306
1
链接失效了............... - Pacerier
5个回答

331

简而言之,无论是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)密码学分析密码比摘要函数更好地发展。

4
很棒的帖子。但我有两个问题。 Blowfish在十多年前被Twofish所取代,一个系统不应该使用现代密码吗?此外,在像Web应用程序这样的系统中,每时每刻都会有很多人登录,成千上万次的迭代似乎是一种浪费。例如,只有在一次只有1个人登录的情况下才会实现PBKDF2,比如用于加密文件系统的字符串2键函数。我使用这句格言:“如果攻击者拿不起它,那么你的服务器也承受不了它。”你怎么想? - rook
17
我认为使用更现代的基元没有任何问题。随着时间的推移,漏洞通常会被发现,Twofish是使用从Blowfish中获得的知识开发的。但是,我不知道有哪些特定漏洞会使Blowfish的使用无效,因此也可以提出“如果没出问题就别修”的论点。关于攻击者的谚语听起来对我不太好。即使您选择了一种需要攻击者测试十亿个密码数年时间的算法,在正常应用程序中它消耗的时间也是微不足道的。 - erickson
15
如果您查看任何哈希函数的规范,您将不会看到任何有关“盐”的内容。唯一的参数是要摘要处理的消息。请查阅任何密码的规范,您会发现该函数是由一个密钥参数化的。可能(或可能不)与哈希一起使用的“盐”只是消息的一部分。哈希算法不需要它,不会特别处理它,也无法区分它和消息的其余部分。因此,虽然确实经常通过加盐来更改消息,但给定的消息只产生一个哈希值。 - erickson
1
作为一名渗透测试员,我会报告锁定账户的应用程序,并报告没有防范暴力破解的应用程序。理想情况下,违规的IP地址必须解决验证码问题,此外,如果有用户名称被攻击(即使该用户名不存在),则该帐户应在进行身份验证之前解决验证码问题。每分钟强制执行X次速率限制也是可以接受的。相关链接:http://security.stackexchange.com/questions/25444/resource-consumption-attacks-against-algorithms - rook
2
@rook:虽然限制应用程序的速率是一种良好的实践,但在这种情况下,您可以假设数据库已被下载并放置在没有您描述的速率限制的设备上。 - Ellert van Koperen
显示剩余9条评论

50
我同意erickson的回答,但有一个要注意的地方:对于密码验证目的而言,bcrypt比单次SHA-512迭代要好得多——因为它慢得多。如果你不明白为什么在这个特定的场景中慢速是一种优势,请再次阅读您链接的文章(向下滚动到“Speed is exactly what you don’t want in a password hash function.”)。
当然,你可以通过数千次迭代来构建一个安全的基于SHA-512的密码哈希算法,就像PHK的MD5算法那样。Ulrich Drepper确实做到了这一点,用于glibc的crypt()。然而,如果你已经有了一个经过测试的bcrypt实现,没有特别的理由去这样做。

3
希望我的回答能够清楚地表明,单次哈希迭代是不足够的(可惜的是,即使这种基本的知识水平也不能假定)。如果只使用一次哈希函数迭代,攻击者可以使用成本约为1000美元的设备,每秒进行数百万次的尝试,在几个月内测试所有长度为8个字符的密码。但是,如果将摘要输出“反馈”数千次,则需要数百年时间才能在该硬件上测试相同的密码集合。Bcrypt通过迭代实现了相同的“密钥加强”效果... - erickson
@erickson:是的,尽管我认为你可能已经埋藏了主旨。我试图表达的观点是,直接比较bcrypt和SHA-512并不真正相关,因为一个是密钥派生函数,而另一个只是一个单独使用不合适的加密原语。 - caf
4
http://codahale.com/how-to-safely-store-a-password/ - ripper234
1
使用数千轮SHA-512并不罕见,考虑到它被包含在各种crypt实现中(包括我使用的PHP),当我阅读原始问题时,我甚至认为OP所指的就是这个 - 他实际上是在比较使用数百或数千次迭代的bcrypt与数千轮SHA-512。 - thomasrutter

36

Blowfish不是散列算法,而是加密算法。这意味着您可以使用blowfish加密某些内容,然后稍后可以将其解密回明文。

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

它们是设计用于不同任务的两个不同的东西。 "blowfish是否比SHA512更好?"没有“正确”的答案,您可能会问"苹果是否比袋鼠更好? "

如果您想了解更多信息,请参阅以下链接:


20
我认为这个问题是关于使用bcrypt作为不可逆的密码保护方式,就像哈希用于此目的一样。 - erickson
3
“@erickson 这段文字“问:但是 Blowfish 比 SHA512 更好吗?”对我来说看起来很清楚,它显示出提问者不理解这两个算法的区别。” - Glen
1
楼主在这里。实际上,基于Glen的回答,Blowfish是一种加密算法(我理解与哈希不同),我现在意识到我的问题确实有些混淆。但现在令人困惑的是,phpass类(我相信用于密码哈希)使用bcrypt(即Blowfish,即加密)。如果Blowfish是加密,那么为什么phpass要用它来哈希密码,这对我来说似乎是一个缺陷,难道我错过了什么吗? - Chris
2
Blowfish是比sha更好的哈希函数,因为它需要更长的哈希时间。我见过的大多数sha实现都非常快。你需要一个慢一点的算法来进行密码哈希。 - John Nicholas
这个答案是正确的,Blowfish是一种加密算法,但在这个上下文中(例如,在bcrypt中使用时),它被用作哈希算法,通过从源字符串派生一个密钥并使用该密钥加密一个魔术数字。这使其成为不可逆的,本质上是一个哈希函数。即使您知道明文和加密数据,也无法从密码中计算出密钥。 - thomasrutter
显示剩余4条评论

4

Blowfish并不比MD5或SHA512更好,因为它们有不同的用途。 MD5和SHA512是哈希算法,而Blowfish是加密算法。这是两种完全不同的加密功能。


2
我建议使用Ulrich Drepper的基于SHA-256/SHA-512的加密实现。
我们将这些算法移植到了Java中,并且您可以在ftp://ftp.arlut.utexas.edu/java_hashes/找到一个自由许可版本的它们。
请注意,大多数现代(L)Unix系统在其/etc/shadow文件中支持Drepper的算法。

PWDTK http://sourceforge.net/projects/pwdtknet/ 使用HMAC-SHA512,但是它通过多次迭代来创建“缓慢性”,也就是其他人在这里谈论的密钥拉伸。如已经提到的,BCrypt比单个SHA-512更好,但是如果您在像PBKDF2这样的东西中使用SHA-512,那么您将很安全(只要您使用大型加密随机盐并足够的迭代强制时间以生成彩虹表)。我刚刚发布的API是由我创建的,如果您正在为.NET开发,则可以做到这一点(为了未来读者的利益)。 - thashiznets

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接