3

哈希算法竞赛的获胜者SHA-3已被选中。获胜者的算法是Keccak

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

如果是,是否有任何用于 Web 编程的 PHP、Python、Ruby 或任何其他语言的 Keccak 实现?

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

4

3 回答 3

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 的数字,但“哪个更安全”并不是一个模糊的相对术语——上面的规则可以用来精确量化它。

于 2013-02-13T20:51:21.763 回答
4

这是一个老问题,但听起来大家又被密码学术语弄糊涂了。让我们澄清一些事情。

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

我不只是迂腐。这些区别很重要,因为 Keccak 不是在与 bcrypt 竞争,而是在与 SHA-256 竞争。

这是在 PHP 中安全存储密码的简单方法:

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

就是这样。您甚至不需要关心这些函数的作用,您只需要使用它们(除非您使用的是 libsodium 之类的东西)。

目前,该接口提供bcrypt。Bcrypt 大部分都很好,除了一些需要注意的脚子弹:

  1. 它会在 72 个字符后截断密码,这会降低具有低熵每字符密钥空间的长密码的安全性。
  2. 如果您尝试通过预散列来规避前一个脚注,请注意不要将原始二进制文件传递给 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.

于 2016-09-07T18:15:01.813 回答
-2

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

“更好”是一个相对的术语。在什么方面更好?安全性、性能、可扩展性、可移植性……?

如果您只想为散列用户密码提供更高的“安全性”,那么 Keccak 可能不是一个好的选择。Blowfish 将为您提供更好的“安全性”,因为如果发现散列,则暴力破解散列将花费更长的时间。

话虽如此,如果您正在寻找在嵌入式架构上运行的东西,或者如果您想要更大的可移植性,Keccak 是一个不错的选择。这是github上的一个PHP实现这里是另一个 你也可以通过下载Keccak源码来做你自己的语言扩展。

但是,老实说,最好坚持你所知道的。如果黑客可以轻松获取您当前使用的河豚散列,那么问题不在于散列算法,而在于对数据库的访问。另请注意,PHP 扩展必须安装在所有使用它的服务器上,如果您使用共享主机,这可能会也可能不会。

实际上,您可能应该坚持现有的。很有可能它足够安全,一旦 Keccak 实现被移植到标准 PHP 核心,您就可以移动(如果需要)。只是我的两分钱。

于 2013-02-08T18:57:36.087 回答