密码盐存储

时间:2012-05-25 10:17:31

标签: php authentication passwords hash salt

我想更新目前仅使用MD5的密码设置。

现在我想做的是使用更强大的东西(可能是sha256),每个用户使用独特的盐。

问题在于盐储存。

我是否将盐存储在数据库中自己的列中?

然后哈希盐+密码,当涉及登录时,从数据库中调用salt和密码,制作一个。

或者我是否通过使用用户名,电子邮件和时间戳来制作盐,这也会为每个用户提供一个独特的盐?

我想知道,如果有人拿着盐作为列的数据库,他们会知道每个用户的盐,然后他们可以破解密码。

3 个答案:

答案 0 :(得分:5)

盐不是秘密,它可以与散列一起存储明文。甚至不需要在数据库中具有第二个字段。如果你看看PHP的crypt()函数,你可以看到salt将包含在哈希值本身中。

这是盐的工作,使已经存在的彩虹板无用,因为必须为一种特定的盐建造彩虹。为每个哈希使用不同的salt将阻止rainbowtable攻击,因为您必须为每个哈希创建一个rainbowtable。这就是为什么没有必要保密盐。

我建议,如果你想改进你的密码哈希系统,你做得对,哈希函数很慢。文章password hashes with bcrypt解释了为密码生成哈希的重要事项。

  • 为每个密码生成一个salt,而不是每个用户。
  • 使用随机(唯一)盐,而不是来自其他参数的盐。
  • 使用慢速哈希函数。

最后但并非最不重要的是,不要害怕正确地执行此操作,应用程序的代码可以像使用MD5的当前实现一样简单。

答案 1 :(得分:2)

忘记MD5或SHA。使用Bcrypt。 (Blow Fish Crypt)来自PHP 5.3及以上版本。 (crypt方法2a)它更安全,处理速度更慢。

使用Bcrypt时,盐与哈希一起存储在同一个场中。没有理由分开。

http://php.net/manual/en/function.crypt.php

答案 2 :(得分:0)

只是阅读另一篇文章,有人说盐不是秘密,可以存储在数据库专栏中。所以这回答了我的问题