首页 文章

SHA512与Blowfish和Bcrypt [关闭]

提问于
浏览
210

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

  • Bcrypt使用Blowfish

  • Blowfish比MD5好

  • 问:但是Blowfish比SHA512好吗?

谢谢..

Update:

我想澄清一点,我理解散列和加密之间的区别 . 是什么促使我这样问这个问题是this articlewhere the author refers to bcrypt as "adaptive hashing"

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

6 回答

  • 4

    Blowfish并不比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的算法 .

  • 308

    我刚看到这个:

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

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

  • 2

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

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

    他们're 2 different things, designed to be used for different tasks. There is no '正确'回答"is blowfish better than SHA512?"你不妨问"are apples better than kangaroos?"

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

  • 31

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

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

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


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

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

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

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

    为了在这里打破加密,攻击者必须从密文中恢复密钥 . 这被称为“已知明文”攻击,因为攻击知道已加密的魔术字符串,但不知道使用的密钥 . Blowfish已经被广泛研究,并且还没有已知的攻击允许攻击者用单个已知的明文找到密钥 .

    因此,就像基于加密摘要的不可逆算法一样,bcrypt会从密码,盐和成本因素中产生不可逆的输出 . 它的优势在于Blowfish对已知明文攻击的抵抗力,这类似于摘要算法上的"first pre-image attack" . 由于它可以用来代替哈希算法来保护密码,因此bcrypt被混淆地称为"hash"算法本身 .

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

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

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

  • 47

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

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

相关问题