SHA512与Blowfish和Bcrypt的比较


222

我正在查看哈希算法,但找不到答案。

  • Bcrypt使用河豚
  • 河豚胜过MD5
  • 问:河豚比SHA512好吗?

谢谢..

更新:

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

由于bcrypt基于Blowfish,因此我被认为Blowfish是一种哈希算法。如果像答案所指出的那样加密,那么在我看来,它不应在本文中占有一席之地。更糟糕的是,他认为bcrypt是最好的。现在也令我困惑的是phpass类(我相信用于密码哈希)使用bcrypt(即河豚,即加密)。根据你们告诉我的新信息(河豚加密),此类听起来很错误。我想念什么吗?


2
没错 请参阅我的答案的更新,以解释bcrypt的工作原理以及为什么它与基于哈希的“单向”算法具有相同的目的。
erickson

3
bcrypt默认情况下,只是具有较高的“工作系数”。SHA假定不会...除非您使用passhash9,否则它可以与工作因子一起使用。为什么这个问题关闭?它远未得到解答,但非常重要。

1
问题链接已关闭......
Pacerier 2014年

Answers:


320

只需说出bcrypt或SHA-512(在诸如PBKDF2之类的适当算法的上下文中)就足够了。答案是肯定的,任何一种算法都足够安全,以至于将通过实现缺陷(而不是密码分析)发生违规行为。

如果您坚持要知道哪个更好,则SHA-512已由NIST等人进行了深入的审查。很好,但是已经认识到的缺陷是,尽管现在无法利用,但它导致了SHA-3在新哈希算法方面的竞争。另外,请记住,对散列算法的研究比对密码的研究“新”,并且密码学家仍在学习它们。

尽管bcrypt整体上没有像Blowfish本身那样受到严格审查,但我相信,基于具有良好理解结构的密码,它可以提供基于哈希的身份验证所缺乏的某些固有安全性。同样,使用通用GPU作为攻击基于SHA-2的哈希的工具也更加容易。由于其内存需求,优化bcrypt要求更专业的硬件,例如带有板载RAM的FPGA。


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

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

如果有人提供的密码散列到密码表中存储的值,则他们将通过身份验证。特别是,由于散列函数的不可逆性,我们假设用户不是持有散列并反转它以查找有效密码的攻击者。

现在考虑使用bcrypt。它使用Blowfish通过从密码“派生”的密钥来加密魔术字符串。以后,当用户输入密码时,将再次获得密钥,并且如果通过使用该密钥进行加密而生成的密文与存储的密文匹配,则将对用户进行身份验证。密文存储在“密码”表中,但从不存储派生密钥。

为了在这里破解密码,攻击者必须从密文中恢复密钥。这称为“已知明文”攻击,因为该攻击知道已加密的魔术字符串,但不知道所使用的密钥。河豚已被广泛研究,尚无攻击可让攻击者使用单个已知明文来查找密钥的攻击。

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

假设正确使用盐阻止了彩虹表,那么任何真正不可逆的功能都会使攻击者反复试验。攻击者可以进行试验的速度取决于该不可逆的“哈希”算法的速度。如果使用哈希函数的单个迭代,则攻击者可以使用成本约为1000美元的设备每秒进行数百万次尝试,并在几个月内测试所有密码,密码最长可包含8个字符。

但是,如果摘要输出被“反馈”数千次,则在该硬件上测试同一组密码将花费数百年的时间。Bcrypt通过在其密钥派生例程中进行迭代来实现相同的“密钥增强”效果,并且适当的基于哈希的方法(如PBKDF2)也可以做到这一点。在这方面,这两种方法是相似的。

因此,我对bcrypt的建议源于以下假设:1)Blowfish具有与SHA-2哈希函数家族类似的审查水平,以及2)密码的密码分析方法比哈希函数的密码分析方法更好。


4
+1个好帖子。但是我有两个问题。河豚被二十多年前的两只鱼所取代,系统不应该利用现代原始方法吗?在诸如Web应用程序之类的系统中,成千上万次迭代似乎是浪费的,在该系统中,许多人在任何给定时刻都在登录。例如,PBKDF2仅在一次有1个人登录的情况下实现,例如加密文件系统的string2key函数。我用的格言是:“如果攻击者无法举起沉重的重量,那么对于您的服务器来说则沉重了”。你怎么看?
菜鸟

17
我认为使用更现代的原语没有任何问题。漏洞通常随着时间的流逝而被发现,Twofish是使用从Blowfish获得的知识开发的。但是,我不知道有哪些特定的漏洞会使Blowfish的使用无效,因此也可以提出“如果不成功”的论点。您关于攻击者的箴言对我来说听起来并不好。即使您选择的算法需要攻击者花费数年时间才能测试十亿个密码,但在合法应用程序中,算法所花费的时间却可以忽略不计。
埃里克森(Erickson)2010年

15
如果您查看任何哈希函数的规范,您将看不到有关“盐”的任​​何内容。唯一的参数是要摘要的消息。查看任何密码的规范,您将看到该功能已使用密钥进行了参数化。可能(也可能不会)与哈希结合使用的“盐” 只是消息的一部分。哈希算法不需要它,也不会对其进行特殊处理,也无法将其与消息的其余部分区分开。因此,虽然确实经常通过加盐来更改消息,但给定消息仅产生一个哈希。
erickson

1
@Andre D作为下个五月期,我报告了锁定帐户的应用程序,而我报告了不会阻止暴力破解的应用程序。理想情况下,有问题的IP地址必须解决验证码,此外,如果以用户名为目标(即使该用户名不存在),则该帐户也应在验证之前解决验证码。强制执行每分钟X的速率限制。相关:security.stackexchange.com/questions/25444/…–
骗子

2
@rook:虽然限制应用程序是一种好习惯,但是在这种情况下,您可以假定数据库已下载并放置在没有您描述的限制速率的设备上。
Ellert van Koperen 2015年

50

我同意埃里克森的回答,有一点需要注意:口令认证的目的,bcrypt是远远好于一个单一的迭代 SHA-512的-仅仅是因为它是慢得多。如果您不明白为什么在这种特定的游戏中,缓慢性是一个优势,请再次阅读您链接的文章(向下滚动至“ 速度正是密码散列函数所不希望的。 ”)。

当然,您可以通过迭代数千次来围绕SHA-512构建安全的密码哈希算法,就像PHK的MD5算法的工作方式一样。 Ulrich Drepper正是针对glibc的crypt()做到了这一点。但是,如果您已经有经过测试的bcrypt实现可用,则没有特别的理由执行此操作。


3
希望我的回答清楚地表明,单次哈希迭代是不够的(可悲的是,甚至不能假设这种基本的知识水平)。“如果使用哈希函数的单个迭代,则攻击者可以使用成本约为1000美元的设备每秒进行数百万次尝试,并在几个月内测试所有密码,密码最长为8个字符。但是,摘要输出是“反馈”的上千倍,这将需要数百年来测试相同的一组对硬件密码的Bcrypt通过迭代达到相同的“钥匙强化”的效果......”
埃里克森

@erickson:是的,尽管我认为您可能已经将书架埋在那里。我试图说明的一点是,直接比较bcrypt和SHA-512并没有真正的意义,因为一个是密钥派生函数,另一个只是一个加密原语,不适合自己使用。
caf


1
使用数千轮SHA-512并不是闻所未闻的,并且考虑到它已包含在各种crypt实现中(包括我使用的PHP中),当我阅读原始问题时,我什至认为这是OP在询问SHA-512时的意思-他实际上指的是数千次SHA-512 vs bcrypt本身使用数百或数千次迭代的结果。
thomasrutter

33

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

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

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

如果您想阅读更多有关该主题的信息,请参见以下链接:


18
我认为问题在于将bcrypt用作密码的不可逆保护,就像散列用于此目的一样。
erickson

3
@erickson文字“问:但是河豚比SHA512更好吗?” 对我来说似乎很清楚,并且表明OP无法理解这两种算法之间的区别
Glen

1
在这里操作。实际上,基于Glen的回答,河豚是一种加密算法(据我所知,它不同于哈希算法),我现在意识到我的问题是困惑的。但是现在令人困惑的是phpass类(我相信用于密码哈希)使用bcrypt(即河豚,即加密)。如果河豚是加密的,phpass为何会使用它来散列密码,对我来说似乎是一个缺陷,不是吗?我想念什么吗?
克里斯,

2
但是,该问题询问哪种苹果和袋鼠更适合特定任务。与哈希算法相比,河豚算法具有更好的哈希功能,因为哈希需要花费一定的时间。我见过的sha的大多数实现都非常快。您需要一种用于密码哈希的慢速算法。
约翰·尼古拉斯

这个答案是正确的,因为Blowfish是一种加密算法,但是在这种情况下(例如在中使用bcrypt),通过从源字符串中获取密钥并将其用于加密幻数,它可以用作哈希算法。这使其不可逆,本质上是哈希函数。即使知道明文和加密数据,也无法通过密码计算密钥。
thomasrutter

4

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


2

我会推荐Ulrich Drepper基于SHA-256 / SHA-512的crypt实现。

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

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


PWDTK sourceforge.net/projects/pwdtknet使用HMAC-SHA512,但是它在许多迭代中都这样做,以创建“慢速”又称为“密钥拉伸”,正如此处其他人所谈论的那样。如前所述,BCrypt比单个SHA-512更好,但是如果在PBKDF2之类的系统中使用SHA-512,那么您的安全性就很好(只要您使用大型加密随机盐和足够多的迭代来迫使时间达到制作一张彩虹表)我刚刚发布的API是我构建的,并且如果您正在开发该API,它将在.NET中做您想要的(以使将来的读者受益)
thashiznets

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.