SHA512与Blowfish和Bcrypt
我在看哈希algorithm,但无法find答案。
- Bcrypt使用河豚
- 河豚比MD5好
- 问:但是Blowfish比SHA512更好吗?
谢谢..
更新:
我想澄清一点,我明白哈希和encryption之间的区别。 是什么促使我以这种方式提出这个问题,本文作者将bcrypt称为“自适应哈希” https://www.nccgroup.trust/us/about-us/newsroom-and-events/blog/2007/ 7月/够了,用最彩虹表,什么,你需要到专门关于安全密码的scheme/
由于bcrypt基于Blowfish,所以我被认为Blowfish是一个哈希algorithm。 如果答案已经指出encryption,那么在我看来,这不应该在这篇文章中有一席之地。 更糟糕的是,他认为bcrypt是最好的。 现在让我困惑的是,phpass类(用于密码哈希algorithm)使用bcrypt(即blowfish,即encryption)。 基于这个新的信息,你们告诉我(河豚是encryption),这个class听起来不对。 我错过了什么吗?
只要说bcrypt或SHA-512(在像PBKDF2这样的合适algorithm的情况下)是否足够好就足够了 。 答案是肯定的,要么algorithm是足够安全的,通过实施漏洞会发生违规,而不是密码分析。
如果你坚持知道哪个“更好”,SHA-512已经得到了NIST等的深入审查。 这很好,但是有一些缺陷已经被认识到,虽然现在不能被利用,但却导致了SHA-3竞争新的散列algorithm。 另外,请记住哈希algorithm的研究比密码algorithm的研究“新”,密码学家仍然在学习它们。
尽pipe整体上来说bcrypt没有像Blowfish本身那么仔细,但我相信基于具有良好理解的结构的密码给了它一些基于散列的authentication所缺乏的内在安全性。 此外,使用常见的GPU作为攻击基于SHA-2的散列的工具更容易; 由于其内存要求,优化bcrypt需要更多专用硬件,如FPGA和一些板载RAM。
注意:bcrypt是一个内部使用Blowfish的algorithm。 它本身不是一个encryptionalgorithm。 它被用来不可逆地掩盖密码,就像散列函数被用来做一个“单向散列”一样。
encryption哈希algorithm被devise成不可能逆转。 换句话说,只给出一个散列函数的输出,它应该“永远”find一个将产生相同散列输出的消息。 事实上,find任何两个产生相同散列值的消息在计算上是不可行的。 与密码不同,哈希函数没有用关键字参数化; 相同的input将始终产生相同的输出。
如果有人提供了一个密码来存储密码表中存储的值,那么他们将被authentication。 特别是,由于散列函数的不可逆性,假设用户不是攻击者获得的散列,并将其反转以find工作密码。
现在考虑bcrypt。 它使用Blowfishencryption一个魔法string,使用密码“派生”的密码。 之后,当用户input密码时,再次导出密钥,如果用该密钥encryption产生的密文与存储的密文匹配,则authentication用户。 密文存储在“密码”表中,但派生密钥从不存储。
为了在这里打破密码,攻击者必须从密文恢复密钥。 这被称为“已知明文”攻击,因为攻击知道已经encryption的魔法string,但不知道使用的密钥。 河豚已经被广泛的研究,而且还没有人知道攻击可以让攻击者用一个已知的明文find密钥。
所以,就像密码摘要的不可逆algorithm一样,bcrypt从密码,盐和成本因素中产生一个不可逆的输出。 它的优势在于Blowfish对已知明文攻击的抵抗,类似于摘要algorithm中的“第一次前映像攻击”。 由于它可以代替哈希algorithm来保护密码,所以bcrypt被混淆地称为“哈希”algorithm本身。
假设彩虹桌被正确使用盐所阻碍,任何真正不可逆转的function都会使攻击者减less反复试验。 攻击者可以进行试验的速率取决于不可逆“散列”algorithm的速度。 如果使用散列函数的单个迭代,攻击者可以使用价值1000美元的设备每秒进行数百万次尝试,在几个月内对所有密码进行长达8个字符的testing。
然而,如果摘要输出被“反馈”数千次,那么在该硬件上testing相同的一组密码将需要几百年的时间。 Bcrypt通过在其密钥派生例程内迭代获得相同的“密钥加强”效果,像PBKDF2这样的合适的基于散列的方法也是一样的; 在这方面,这两种方法是相似的。
所以,我对bcrypt的推荐源于以下假设:1)Blowfish与SHA-2哈希函数家族具有类似的审查水平,2)密码分析方法比哈希函数的密码分析方法更好。
我同意埃里克森的回答,但有一点需要注意:出于密码validation的目的,bcrypt 远远好于SHA-512的单一迭代 – 仅仅因为它慢得多。 如果你不明白为什么缓慢在这个特定的游戏中是一个优势,请阅读你链接到的文章(向下滚动到“ 速度正是你不想在密码哈希函数中。 ”)。
您当然可以通过迭代数千次来构buildSHA-512的安全密码散列algorithm,就像PHK的MD5algorithm一样。 Ulrich Drepper正是这样做的 ,为了glibc的地穴()。 没有特别的理由要做,但是,如果你已经有一个经过testing的bcrypt实现。
河豚不是一个哈希algorithm。 这是一个encryptionalgorithm。 这意味着你可以使用河豚encryption一些东西,然后你可以解密成纯文本。
SHA512是一种哈希algorithm。 这意味着(在理论上)一旦你散列input,你不能再次获得原始input。
他们是两个不同的东西,旨在用于不同的任务。 没有“正确”的答案是“河豚比SHA512更好吗?” 你可能会问: “苹果比袋鼠更好吗?”
如果你想阅读更多的话题,这里有一些链接:
- 河豚
- SHA512
河豚不比MD5或SHA512更好,因为它们服务于不同的目的。 MD5和SHA512是哈希algorithm,Blowfish是一种encryptionalgorithm。 两个完全不同的密码function。
我会推荐Ulrich Drepper基于SHA-256 / SHA-512的crypt实现。
我们将这些algorithm移植到Java,并且您可以在ftp://ftp.arlut.utexas.edu/java_hashes/find它们的免费许可版本。;
请注意,大多数现代(L)Unices在其/ etc / shadow文件中支持Drepper的algorithm。