已选择SHA-3
哈希算法竞赛的获胜者。获胜者的算法是 Keccak 。
我使用Blowfish并且非常喜欢它,但据说Keccak更好。是否值得使用它在我的网站上存储用户的密码?
如果是,是否有用于Web编程的用于PHP,Python,Ruby或任何其他语言的Keccak的实现?
我希望这个问题也可以帮助其他人。谢谢!
答案 0 :(得分:22)
简短回答:
不,也许永远不会。对于密码哈希,BCrypt& PBKDF2-HMAC- xxx 是比任何简单的SHA- 1/2/3 算法更好的选择。在SHA-1/2实际发布可行的preimage攻击之前,SHA-3实际上是最差的选择,特别是因为它的速度和低缓存占用。
更长的回答:
不同密码哈希算法的相对安全性的一个主要因素是:专用攻击者哈希密码与您相比可以多快多少?也就是说,他们的软件/硬件组合(为密码散列的明确目的而购买)与服务器上的软件(软件的现成C实现,为应用程序的需求而购买的硬件)的速度要快得多。
SHA-3的主要标准之一是应该在嵌入式架构上高效运行,这些架构以少量的片上高速缓存,寄存器等为代表。但这也描述了现代GPU:更少的寄存器/累加器,更小on-die缓存;但另一方面,他们的芯片经过优化,可以在大量数据上并行执行相同的任务。这对于攻击者的蛮力尝试来说是完美的:因为通过购买另一个GPU,攻击者可以通过购买更好的CPU来获得更多SHA3哈希/秒。
由于这个特殊原因,BCrypt被设计为对内存表进行大量读/写操作,目前这个表大于大多数GPU的缓存。这意味着当前基于GPU的BCrypt实现甚至无法与其CPU对应的速度相提并论。因此,只要选择BCrypt,就可以通过强迫他购买与你相同的CPU来减慢攻击者对他花费的每一美元的优势。
这就是为什么原始速度是密码散列的敌人。 您希望选择最快的软件/硬件组合为您的攻击者提供比您将使用的商品软件/硬件的每美元最少优势的算法。现在,这是BCrypt,或PBKDF2-HMAC- xxx 的稍微选择。由于GPU可能只会更好地做SHA3,我怀疑它永远是正确的选择。我没有关于SHA3的数字,但“哪个更安全”并不是一个模糊的相对术语 - 上述规则可用于精确量化它。
答案 1 :(得分:4)
这是一个老问题,但听起来每个人都被cryptography terminology再次混淆了。让我们澄清一些事情。
我不只是迂腐;这些区别非常重要,因为Keccak没有与bcrypt竞争,它与SHA-256竞争。
这是safely store a password in PHP:
的简便方法password_hash()
,password_verify()
和password_needs_rehash()
那就是它。你甚至不需要关心这些功能的作用,你只需要使用它们(除非你使用像libsodium这样的东西)。
目前,此界面提供了bcrypt。 Bcrypt大部分都很好,只有几个小脚子要注意:
NUL
个字符后截断。如果您担心这些问题,password_lock中存在暂时的权宜之计。
在PHP 7.2中,很可能通过此接口使用Argon2i(假设RFC通过)。
在几年内(大约PHP 7.5,假设没有主要版本颠簸)我们可能会看到PASSWORD_ARGON2I
成为PASSWORD_DEFAULT
的新值,但可能不会。我们已经有几年时间让密码学研究人员对它有信心。
答案 2 :(得分:-2)
I use Blowfish and really like it, but Keccak is said to be better.
“更好”是一个相对的术语。更好的是什么?安全性,性能,可扩展性,可移植性......?
如果您希望更高的“安全性”仅用于散列用户密码,那么Keccak可能是一个不好的选择。 Blowfish将为您提供更好的“安全性”,因为如果发现散列,则需要更长时间来强制执行散列。
话虽如此,如果您正在寻找可在嵌入式架构上运行的东西,或者您想要更高的可移植性,Keccak是一个不错的选择。 Here is a PHP implementation on github和here is another 您也可以downloading the Keccak source制作自己的语言扩展程序。
但老实说,最好坚持你所知道的。如果黑客可以轻松获得您当前正在使用的河豚哈希,那么问题不是哈希算法,而是访问数据库。另请注意,必须使用此扩展程序在所有服务器上安装PHP扩展,如果您使用共享主机,这可能会也可能不会。
实际上,你应该坚持使用你拥有的东西。机会足够安全,一旦Keccak实现移植到标准PHP核心,您就可以移动(如果需要)。只是我的两分钱。