2

这是我当前在 PHP/SQL 项目中的密码散列程序...

  • 从 /dev/urandom 获取每个用户的 512 位盐,存储在用户的数据库记录中,除了最终的哈希
  • 从存储在文件系统中的 /dev/urandom 中获取 512 位“胡椒”。这是每个应用程序的常量,并且对于每个用户都是相同的
  • 然后hash('sha512', $password.$salt.$pepper, TRUE)

哈希和盐以二进制形式存储在数据库中,主要是出于习惯。我认为这在安全性方面没有任何区别。如果有的话,它对于 SQL 备份来说稍微不方便,并且使 PHP 代码看起来稍微复杂一些。

如今hash(),SHA-256 或 SHA-512 是否被普遍认为已被 bcrypt 取代?
我相信 SHA-2 (256/512) 仍然被认为是加密安全的,我可能过度使用熵位。与攻击者从数据库转储中对 SHA-2 哈希进行逆向工程相比,这更有可能是我的代码中的一个缺陷导致问题。

但是我是否应该更新我的方法以改为crypt()与 CRYPT_BLOWFISH 一起使用(我相信这被称为 bcrypt,从技术上讲,河豚是一种密码而不是散列算法)?
甚至就像未来的最佳实践一样?

我并不特别担心算法的计算费用(在合理范围内)。这只会成为创建帐户、更改密码或登录时哈希然后比较时的一个因素。这些活动只占页面浏览量的一小部分。我想在某种程度上越慢越好,如果它使服务器更难生成,那么它将使攻击者的工作更慢以暴力破解。

干杯,B

4

2 回答 2

5

如果你可以等到 php 5.5,将会有一些有用的内置函数:

https://gist.github.com/3707231

到那时,使用 crypt - 你可以看看这个新功能的前向兼容端口:

https://github.com/ircmaxell/password_compat

于 2012-09-17T22:54:00.590 回答
2

您肯定走在正确的轨道上,bcrypt 是一种非常好的存储密码的方法(scrypt 更好,但很难在 PHP 中找到一个好的实现)。

请记住,sha1、sha256、sha512从未用于散列密码。它们的设计速度很快,因此您可以在最短的时间内获取大型数据集并为其创建独特的签名。它们用于签名比其他任何东西都多。

您肯定想使用需要更多时间的散列算法。

旁注:有些人会争辩说胡椒毫无意义,因为如果他们入侵了您的系统,他们将可以使用您的盐和胡椒。

这篇文章对密码安全性有一些深刻的见解。

于 2012-09-18T01:51:41.940 回答