密码存储,hash()与sha-512或crypt()与河豚(bcrypt)?

时间:2012-09-17 22:41:13

标签: php hash sha bcrypt password-encryption

这是我目前在PHP / SQL项目中的密码哈希程序...

  • 从/ dev / urandom获取512位每用户salt,除了最终哈希值之外,还存储在用户的DB记录中
  • 从/ dev / urandom中取出512bits的“pepper”,它存储在文件系统中。这是一个 每个应用程序不变,每个用户都是一样的
  • 然后hash('sha512', $password.$salt.$pepper, TRUE)

散列和salt在DB中以二进制形式存储,主要是出于习惯。我认为它在安全方面没有任何区别。如果有的话,它对SQL备份来说稍微不方便,并使PHP代码出现稍微复杂一些。

这些天通常认为带有SHA-256或SHA-512的hash()被bcrypt取代了吗?
我相信SHA-2(256/512)仍然被认为是加密安全的,我可能过度使用了熵位。与攻击者从数据库转储中反向设计SHA-2哈希相比,我的代码中的缺陷更有可能导致问题。

但是我应该更新我的方法,而不是使用CRYPT_BLOWFISH来使用crypt()(我相信这被称为bcrypt,其中blowfish技术上是一种密码而不是哈希算法)? 即使只是作为未来的最佳实践?

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

干杯,B

2 个答案:

答案 0 :(得分:5)

如果你可以等到php 5.5,那么内置的内容会有一些有用的功能:

https://gist.github.com/3707231

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

https://github.com/ircmaxell/password_compat

答案 1 :(得分:2)

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

请记住,sha1,sha256,sha512 从不制作哈希密码。它们设计得很快,因此您可以在最短的时间内获取大型数据集并为它们创建唯一的签名。它们比其他任何东西都用于签名。

您肯定希望使用一个更多时间的散列算法。

旁注:有些人认为胡椒是毫无意义的,因为如果它们破坏你的系统,他们就可以获得你的盐和胡椒。

This post对密码安全有一些很好的见解。