SHA512 与 Blowfish 和 Bcrypt [关闭]
Posted
技术标签:
【中文标题】SHA512 与 Blowfish 和 Bcrypt [关闭]【英文标题】:SHA512 vs. Blowfish and Bcrypt [closed] 【发布时间】:2010-12-06 09:06:35 【问题描述】:我正在研究散列算法,但找不到答案。
Bcrypt 使用 Blowfish 河豚优于 MD5 问:Blowfish 比 SHA512 更好吗?谢谢..
更新:
我想澄清一下,我理解散列和加密之间的区别。促使我以这种方式提出问题的是this article,作者将 bcrypt 称为“自适应哈希”
由于 bcrypt 是基于 Blowfish,我被引导认为 Blowfish 是一种哈希算法。如果它是答案所指出的加密,那么在我看来它不应该在本文中占有一席之地。更糟糕的是,他得出的结论是 bcrypt 是最好的。 现在让我感到困惑的是 phpass 类(我相信用于密码散列)使用 bcrypt(即河豚,即加密)。根据你们告诉我的这个新信息(河豚是加密),这个类听起来是错误的。我错过了什么吗?
【问题讨论】:
没有错;请参阅我的答案的更新,以了解 bcrypt 的工作原理以及为什么它与基于哈希的“单向”算法具有相同的目的。bcrypt
默认情况下具有更高的“工作系数”。假定 SHA 不会...除非您使用 passhash9,它可以与工作因子一起使用。为什么这个问题被关闭了?它远未得到解答,但非常重要。
相关链接已关闭......
【参考方案1】:
足以说明 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) 密码的密码分析方法比哈希函数的密码分析方法开发得更好功能。
【讨论】:
+1 很棒的帖子。但我有两个问题。十多年前,河豚被双鱼取代,系统不应该利用现代原语吗?此外,在许多人在任何给定时刻登录的 Web 应用程序等系统中,数千次迭代似乎也是一种浪费。例如,PBKDF2 仅在一次有 1 人登录的情况下实现,例如用于加密文件系统的 string2key 函数。我使用格言“如果它对攻击者来说太重了,那么它对你的服务器来说太重了。”你怎么看? 我不认为使用更现代的原语有什么问题。漏洞经常随着时间的推移而被发现,而 Twofish 是利用从 Blowfish 获得的知识开发的。但是,我不知道会导致 Blowfish 使用无效的特定漏洞,因此也可以提出“如果它没有破坏”的论点。你关于攻击者的格言对我来说听起来不太好。即使您选择的算法需要数年时间让攻击者测试十亿个密码,它在合法应用程序中消耗的时间也可以忽略不计。 如果您查看任何哈希函数的规范,您将看不到任何关于“盐”的信息。唯一的参数是要消化的消息。查看任何密码的规范,您将看到该函数已使用密钥进行参数化。可以(或不)与散列一起使用的“盐”只是消息的一部分。散列算法不需要它,不会对其进行特殊处理,也无法将其与消息的其余部分区分开来。因此,虽然消息经常被加盐修改,但给定的消息只产生一个哈希值。 @Andre D 作为一名渗透测试人员,我报告了锁定帐户的应用程序,并且我报告了不能防止暴力破解的应用程序。理想情况下,有问题的 IP 地址必须解决验证码,此外,如果目标用户名(即使该用户名不存在),则该帐户应在验证之前解决验证码。执行每分钟 X 的速率限制也是可以接受的。相关:security.stackexchange.com/questions/25444/… @rook : 虽然速率限制应用程序是一种很好的做法,但在这种情况下,您可以假设数据库已下载并放置在没有您描述的速率限制的设备上。【参考方案2】:我同意 erickson 的回答,但有一个警告:出于密码验证目的,bcrypt 远优于 SHA-512 的 单次迭代 - 仅仅是因为它远慢点。如果您不明白为什么在这个特定游戏中缓慢是一个优势,请再次阅读您链接到的文章(向下滚动到“速度正是您在密码哈希函数中不想要的。 ")。
您当然可以通过迭代数千次来围绕 SHA-512 构建安全的密码散列算法,就像 PHK 的 MD5 算法的工作方式一样。 Ulrich Drepper did exactly this,用于 glibc 的 crypt()。但是,如果您已经有一个经过测试的 bcrypt 实现可用,则没有特别的理由这样做。
【讨论】:
希望我的回答清楚地表明单个哈希迭代是不够的(遗憾的是,即使是这种基本的知识水平也不能假设)。 “如果使用哈希函数的单次迭代,攻击者可以使用成本约为 1000 美元的设备每秒进行数百万次试验,在几个月内测试长达 8 个字符的所有密码。但是,如果摘要输出被“反馈”数千次,在该硬件上测试同一组密码需要数百年。Bcrypt 通过迭代实现相同的“密钥强化”效果……” @erickson: 是的,虽然我认为你可能已经把 lede 埋在那里了。我试图说明的一点是,直接比较 bcrypt 和 SHA-512 并不真正相关,因为一个是密钥派生函数,另一个只是加密原语,本身不适合。 codahale.com/how-to-safely-store-a-password 使用数千轮 SHA-512 并非闻所未闻,并且考虑到它包含在各种crypt
实现中(包括在我使用的 PHP 中),当我阅读原始问题时,我什至认为这就是当他询问 SHA-512 时,OP 的意思是 - 他实际上指的是数千轮 SHA-512 vs bcrypt,它本身使用了数百或数千次迭代。【参考方案3】:
Blowfish 不是散列算法。是一种加密算法。这意味着您可以使用河豚加密某些内容,然后再将其解密回纯文本。
SHA512 是一种散列算法。这意味着(理论上)一旦您对输入进行哈希处理,您就无法再次获取原始输入。
它们是两种不同的东西,旨在用于不同的任务。 “河豚比 SHA512 更好吗?” 你不妨问“苹果比袋鼠好吗?”
如果您想阅读更多关于该主题的内容,请点击以下链接:
Blowfish SHA512【讨论】:
我认为问题在于使用 bcrypt 作为密码的不可逆保护,就像哈希用于此目的一样。 @erickson 文本“问:但是 Blowfish 比 SHA512 更好吗?”对我来说似乎很清楚,并表明 OP 不理解这两种算法之间的区别 在这里操作。实际上,根据格伦的说法,河豚是一种加密算法(我理解它与散列不同),我现在意识到我的问题是被混淆了。但现在令人困惑的是 phpass 类(我相信用于密码散列)使用 bcrypt(即河豚,即加密)。如果河豚是加密的,那么 phpass 怎么用它来散列密码,对我来说似乎是一个缺陷,不是吗?我错过了什么吗? 但问题是苹果和袋鼠中的哪一个更适合特定任务。 Blowfish 是比 sha 更好的散列函数,因为散列需要时间。我见过的大多数 sha 实现都非常快。您需要一种用于密码散列的慢速算法。 这个答案是正确的,Blowfish 是一种加密算法,但在这种情况下(例如,当在bcrypt
中使用时)它通过从源字符串派生密钥并使用加密一个幻数。这使得它不可逆,本质上是一个散列函数。即使您知道明文和加密数据,也无法根据密码计算密钥。【参考方案4】:
Blowfish 并不比 MD5 或 SHA512 好,因为它们的用途不同。 MD5 和 SHA512 是散列算法,Blowfish 是加密算法。两种完全不同的加密函数。
【讨论】:
【参考方案5】:我会推荐 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 是由我构建的,如果这是您正在开发的,它将在 .NET 中做您想做的事情(为了未来的读者受益)以上是关于SHA512 与 Blowfish 和 Bcrypt [关闭]的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 OpenSSL 计算 SHA512/224 和 SHA512/256 哈希?