我想更新目前仅使用MD5的密码设置。
现在我想做的是使用更强大的东西(可能是sha256),每个用户使用独特的盐。
问题在于盐储存。
我是否将盐存储在数据库中自己的列中?
然后哈希盐+密码,当涉及登录时,从数据库中调用salt和密码,制作一个。
或者我是否通过使用用户名,电子邮件和时间戳来制作盐,这也会为每个用户提供一个独特的盐?
我想知道,如果有人拿着盐作为列的数据库,他们会知道每个用户的盐,然后他们可以破解密码。
答案 0 :(得分:5)
盐不是秘密,它可以与散列一起存储明文。甚至不需要在数据库中具有第二个字段。如果你看看PHP的crypt()
函数,你可以看到salt将包含在哈希值本身中。
这是盐的工作,使已经存在的彩虹板无用,因为必须为一种特定的盐建造彩虹。为每个哈希使用不同的salt将阻止rainbowtable攻击,因为您必须为每个哈希创建一个rainbowtable。这就是为什么没有必要保密盐。
我建议,如果你想改进你的密码哈希系统,你做得对,哈希函数很慢。文章password hashes with bcrypt解释了为密码生成哈希的重要事项。
最后但并非最不重要的是,不要害怕正确地执行此操作,应用程序的代码可以像使用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)
只是阅读另一篇文章,有人说盐不是秘密,可以存储在数据库专栏中。所以这回答了我的问题