这是我当前在 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