SHA512与Blowfish和Bcrypt

Chr*_*ris 221 security encryption passwords hash

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

  • Bcrypt使用Blowfish
  • 河豚比MD5好
  • 问:但是Blowfish比SHA512好吗?

谢谢..

更新:

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

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

eri*_*son 318

应该说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)密码的密码分析方法比哈希函数的密码分析方法更好.

  • 我不认为使用更现代的原语有什么不妥.随着时间的推移经常发现漏洞,Twofish是利用从Blowfish获得的知识开发的.但是,我不知道特定的漏洞会使Blowfish的使用无效,因此也可能会出现"如果不打破"的说法.关于攻击者的谚语对我来说听起来不太好.即使您选择的算法需要多年才能让攻击者测试十亿个密码,但在合法应用程序中消耗的时间可以忽略不计. (17认同)
  • 如果你看一下任何哈希函数的规范,你就不会看到任何关于"盐"的东西.唯一的参数是要消化的消息.查看任何密码的规范,您将看到该函数使用密钥进行参数化.可能(或可能*不*)与散列一起使用的"salt"只是消息的一部分.哈希算法不需要它,不会特别对待它,也不能将它与消息的其余部分区分开来.因此,虽然*消息通常通过salting来改变*,但给定的消息只产生一个散列. (15认同)
  • +1精彩帖子.但我有两个问题.十多年前,Blowfish被两种形式所取代,系统是否应该利用现代原语?此外,数千次迭代在诸如Web应用程序之类的系统中似乎是浪费的,其中许多人在任何给定时刻都登录.例如,PBKDF2仅在一个人一次登录的情况下实现,例如加密文件系统的string2key函数.我使用的格言"如果它太重,攻击者无法解除,那么它对你的服务器来说太沉重了." 你怎么看? (4认同)
  • @rook:虽然限速应用程序是一种很好的做法,但在这种情况下,您可以假设数据库已经下载并放置在没有您描述的速率限制的设备上. (2认同)

caf*_*caf 49

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

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

  • http://codahale.com/how-to-safely-store-a-password/ (4认同)
  • 希望我的回答清楚地表明单个哈希迭代是不够的(遗憾的是,甚至不能假设这个基本的知识水平)."如果使用哈希函数的单次迭代,攻击者可以使用成本大约为1000美元的设备每秒进行数百万次试验,在几个月内测试长达8个字符的所有密码.但是,如果使用摘要输出被"反馈"了数千次,在这个硬件上测试同一套密码将花费数百年的时间.Bcrypt通过迭代实现相同的"密钥加强"效果......" (3认同)

Gle*_*len 31

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

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

它们是两种不同的东西,旨在用于不同的任务."河豚鱼比SHA512好吗?"没有"正确"的答案. 你不妨问一下"苹果比袋鼠好吗?"

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

  • 我认为问题是关于使用bcrypt作为密码的不可逆保护,就像为此目的使用散列一样. (18认同)
  • @erickson的文字"Q:但是Blowfish比SHA512好吗?" 对我来说似乎很清楚,并表明OP不理解2种算法之间的差异 (3认同)
  • 然而,问题是哪个苹果和袋鼠更适合特定的任务.Blowfish是一种比sha更好的散列函数,因为它有时间散列.我见过的大部分实现都非常快.您需要一个缓慢的密码哈希算法. (2认同)