盐与密码
盐与密码
这个问题已经在这里有了答案:
可能是重复的:
警告 不要使用MD5密码,使用像bcrypt这样的替代方案
对于我的密码,我应该像这样使用盐(盐对于每个用户都是唯一的,不会直接存储在密码中)...
$salt = sha1(md5("coders gonna code")); $password = md5($salt.$password);
或者如果我只使用以下内容,是否可以:
$password = md5($password);
因为如果我使用了盐,即使用户制造一个像password这样的差密码,也无所谓,因为盐(在此情况下)将是145ac26ff093c6e1317f7d5fb4c9fd11c77be975
,所以他们的密码条目将是145ac26ff093c6e1317f7d5fb4c9fd11c77be975password
,根据http://howsecureismypassword.net/
,它需要3千亿年才能破解...所以,你有什么看法?还是我该更糟糕,去
$password = md5($salt.$password.md5($salt));
如果那个人已经走得足够远,以至于可以得到盐哈希,那么有什么能够阻止他们再走得更远吗?<更像是一个声明的最后一个密码
对于每个说我应该为每个用户这样做的人...我知道,这只是一个例子。
你应该将盐值改为针对每个用户的特定值,而不是系统范围的常量。这将使对密码哈希攻击的彩虹表攻击变得更加困难。
Troy Hunt在他的这篇文章中对盐的演变进行了良好的阐述。
Edit
$salt
是与用户账户一起存储的一种独特的字节序列,可以为每个密码记录增加很大的熵。通常,这是一个随机的字节数组。
传统上是在salt
+ password
的串联上进行哈希。
$passwordHash = hash($salt.$password);
正如其他人所说,不要使用MD5进行哈希。它已经被攻破了。
在哈希之前对密码或盐应用其他专有算法是不推荐的。相反,应该考虑采用行业标准的解决方案,例如PBKDF2,除了盐之外,还需要进行许多重复的迭代(通常> 10k),这将进一步降低攻击者的速度。
如果采用OWASP指南,则应定期增加哈希次数(以抵消摩尔定律)。哈希次数还应该针对每个用户进行持久化存储,这意味着您需要存储哈希密码、盐和迭代次数的三重信息。