哈希算法竞赛的获胜者SHA-3
已被选中。获胜者的算法是Keccak。
我使用 Blowfish 并且非常喜欢它,但据说 Keccak 更好。是否值得将其用于在我的网站上存储用户密码?
如果是,是否有任何用于 Web 编程的 PHP、Python、Ruby 或任何其他语言的 Keccak 实现?
我希望这个问题对其他人也有帮助。谢谢!
简短的回答:
不,而且可能永远不会。对于密码散列,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 的数字,但“哪个更安全”并不是一个模糊的相对术语——上面的规则可以用来精确量化它。
这是一个老问题,但听起来大家又被密码学术语弄糊涂了。让我们澄清一些事情。
我不只是迂腐。这些区别很重要,因为 Keccak 不是在与 bcrypt 竞争,而是在与 SHA-256 竞争。
这是在 PHP 中安全存储密码的简单方法:
password_hash()
,password_verify()
和password_needs_rehash()
就是这样。您甚至不需要关心这些函数的作用,您只需要使用它们(除非您使用的是 libsodium 之类的东西)。
目前,该接口提供bcrypt。Bcrypt 大部分都很好,除了一些需要注意的脚子弹:
NUL
字符之后截断。如果您担心这些问题,password_lock中存在临时权宜之计。
在 PHP 7.2 中,很可能可以通过此接口使用 Argon2i(假设 RFC 通过)。
In a few years (circa PHP 7.5, assuming no major version bumps) we may see PASSWORD_ARGON2I
become the new value for PASSWORD_DEFAULT
, but maybe not. We've got a few years for cryptography researchers to gain confidence in it.
I use Blowfish and really like it, but Keccak is said to be better.
“更好”是一个相对的术语。在什么方面更好?安全性、性能、可扩展性、可移植性……?
如果您只想为散列用户密码提供更高的“安全性”,那么 Keccak 可能不是一个好的选择。Blowfish 将为您提供更好的“安全性”,因为如果发现散列,则暴力破解散列将花费更长的时间。
话虽如此,如果您正在寻找在嵌入式架构上运行的东西,或者如果您想要更大的可移植性,Keccak 是一个不错的选择。这是github上的一个PHP实现,这里是另一个 你也可以通过下载Keccak源码来做你自己的语言扩展。
但是,老实说,最好坚持你所知道的。如果黑客可以轻松获取您当前使用的河豚散列,那么问题不在于散列算法,而在于对数据库的访问。另请注意,PHP 扩展必须安装在所有使用它的服务器上,如果您使用共享主机,这可能会也可能不会。
实际上,您可能应该坚持现有的。很有可能它足够安全,一旦 Keccak 实现被移植到标准 PHP 核心,您就可以移动(如果需要)。只是我的两分钱。