2013-02-08 247 views
3

SHA-3哈希算法大赛的优胜者已被选中。赢家的算法是Keccak密码哈希:Keccak与否

我使用Blowfish并非常喜欢它,但Keccak据说更好。是否值得使用它来存储我的网站上的用户密码?

如果是,那么在Web编程中是否有Keccak for PHP,Python,Ruby或任何其他语言的实现?

我希望这个问题也能帮助其他人。谢谢!

+0

一旦你有一个哈希算法,它很难切换。你必须保持这两个直到所有的密码都被转换。这可能永远不会。除非您有充分理由怀疑您目前的解决方案不够安全,否则我不会担心。 – datasage 2013-02-08 18:48:05

+0

任何一点downvoting?我搜索了它并在Stack Overflow上搜索了类似的问题。 – TheJSB 2013-02-08 18:53:44

+0

你应该真的使用像PBKDF2这样的现成解决方案,聆听Eli的回答。你的问题似乎假设散列算法是可以选择的,但你确实需要一个完整的安全构造。 – u0b34a0f6ae 2013-03-04 13:21:23

回答

-2

I use Blowfish and really like it, but Keccak is said to be better.

“更好的” 是这样一个相对的术语。什么更好?安全性,性能,可扩展性,可移植性......?

如果你想要更大的“安全性”仅仅用于散列用户密码,那么Keccak可能是而不是不错的选择。河豚会给你更好的“安全”,因为如果哈希被发现,它将需要更长的时间来蛮横的哈希。这就是说,Keccak是一个体面的选择,如果你想要在嵌入式架构上运行的东西,或者如果你想要更大的可移植性。 Here is a PHP implementation on githubhere is another 您还可以通过downloading the Keccak source进行自己的语言扩展。

但是,说实话,最好坚持你所知道的。如果黑客可以轻松地获得目前使用的blowfish哈希,那么问题不在于哈希算法,而是访问数据库。另请注意,PHP扩展必须安装在所有使用此扩展的服务器上,如果您使用的是共享主机,则可能或不可能。

在现实中,你应该坚持你拥有的东西。机会是足够安全的,一旦Keccak实现被移植到标准的PHP核心,你就可以移动(如果你需要的话)。只是我的两分钱。

+0

谢谢!很好的答案。 – TheJSB 2013-02-08 19:14:06

+5

对不起,但这个老的接受答案是错误的,并可能误导。 Keccak是一个非常快速的哈希,这意味着它可以被强制 - 攻击者可以在合理的计算时间内测试所有候选明文密码。请参阅有关密码存储的规范答案:http://security.stackexchange.com/questions/211/how-to-securely-hash-passwords/31846#31846 – 2013-08-30 16:02:38

+0

@JesperMortensen:Keccak的快速并不妨碍其用于密码散列。你可以通过像Keccak(Keccak(Keccak(...(Keccak(password)|| password)|| ...))这样的迭代使其尽可能慢,但最好使用已推荐的密码哈希算法包括这样的“慢化” – sellibitze 2013-10-09 15:49:45

22

简短的回答:

没有,而且可能永远。对于密码散列,BCrypt & PBKDF2-HMAC-xxx是比任何简单SHA-1/2/3算法更好的选择。直到SHA-1/2实际发布可行的原像攻击,SHA-3实际上是最差的选择,特别是,因为它的速度和低缓存足迹。

不再回答:

在不同的密码散列算法的相对安全性的主要因素是:如何更快可以专门攻击哈希密码和你比?也就是说,他们的软件/硬件组合(为了密码哈希的明确目的而购买)与您服务器上的软件(用于软件的现成C实现,为您的应用程序的需求购买的硬件)相比要快得多。

其中一个主要的SHA-3标准是应该在嵌入式体系结构上高效地运行,嵌入式体系结构以少量片上高速缓存,寄存器等为代表。但是这也描述了现代GPU:更少的寄存器/累加器,更小的片上缓存;但在另一方面,他们的硅片经过优化,可以在大量数据上并行执行相同的任务。这对于攻击者的暴力攻击是非常完美的:对于花费在硅片上的美元,攻击者通过购买另一颗GPU获得更多的SHA3散列/秒,而不是购买更好的CPU。

由于这个特殊原因,BCrypt被设计为对内存表执行大量的读/写操作,目前这个表大于大多数GPU的缓存。这意味着目前基于GPU的BCrypt实现甚至没有达到CPU速度。所以只要选择BCrypt,你就可以放慢攻击者在他花费的每一美元的优势,迫使他像你一样购买CPU。

这就是为什么原始速度是密码哈希的敌人。 您想要选择最快的软件/硬件组合为您的攻击者提供最低优势的算法,而不是您将使用的商品软件/硬件。现在,这就是BCrypt,或者PBKDF2-HMAC-xxx的选择稍差。由于GPU可能只会更好地吸收SHA3,所以我怀疑它是否是正确的选择。我没有SHA3上的数字,但“哪个更安全”不是一个含糊不清的相对术语 - 上述规则可用于精确量化它。

+0

这是一个很棒的答案。我甚至没有考虑过它,但是你@Eli_Collins,很明显,较慢的算法是有利的 - 特别是对于密码散列。 – ChaseMoskal 2013-08-20 00:32:03

4

这是一个老问题,但听起来好像每个人都被cryptography terminology再次弄糊涂了。让我们来澄清一些事情。

  • Keccak是一个密码散列函数。
  • Blowfish是一个块密码(它有一个64位块大小,不应该用于加密)。
  • Bcrypt是一个密码散列函数,它具有与单纯的密码散列函数不同的用例。 Bcrypt基于Blowfish,但它不是Blowfish。

我不只是迂腐;这些区别非常重要,因为Keccak不会与bcrypt竞争,它与SHA-256竞争。

这里有一个简单的方法来safely store a password in PHP

  1. 使用password_hash()password_verify()password_needs_rehash()

就是这样。你甚至不需要关心这些函数做什么,你只需要使用它们(除非你使用类似libsodium的东西)。

目前,该接口提供bcrypt。 Bcrypt主要是罚款,除了少数脚子弹注意:

  1. 之后72个字符,这会降低长密码的安全性与低熵每个字符键空间截断密码。
  2. 如果试图通过预散列规避前一个子弹,请注意不要将原始二进制传递给bcrypt,因为它在截取NUL字符后也会截断。

如果您担心这些问题,password_lock中存在一个临时的权宜之计。

在PHP 7.2中,通过此接口可能会使用Argon2i(假设RFC通过)。

在几年(大约PHP 7.5,假设没有大的版本颠簸),我们可能会看到PASSWORD_ARGON2I成为PASSWORD_DEFAULT的新值,但可能不会。对于密码学研究人员来说,我们已经有了几年的时间来获得它的信心。

+2

如#2所述,您可以通过预散列,对预散列进行ASCII编码,然后将该ASCII字符串发送给Bcrypt来打败72字符的Bcrypt限制。基本上:'password_hash(base64_encode(hash('sha256',$ password)),PASSWORD_DEFAULT);' – 2016-09-07 18:21:44

+0

@AaronToponce PHP的'hash'默认已经返回一个十六进制编码的字符串,所以你可以省略'base64_encode' – CodesInChaos 2016-09-08 11:59:07

+0

或者,将'true'传递给'hash()'。 Base64编码而不是十六进制编码的原因是你可以在72字符截止之前放入更多可能的值,但是SHA256哈希具有比任何人都能够迭代更多的可能值,更不用说尝试使用bcrypt哈希了。 – 2016-09-08 13:26:46