Possible Duplicate:
Secure hash and salt for PHP passwords
警告:不要将MD5用于密码,请使用类似bcrypt的替代方法
对于我的密码,我应该像这样使用salt(salt对每个用户都是唯一的,而不是直接与密码一起存储)。
1 2
| $salt=sha1(md5("coders gonna code"));
$password = md5($salt.$password); |
或者如果我只是使用:
1
| $password = md5($password); |
因为如果我使用salt,即使用户编了一个像password这样的坏密码,也没关系,因为salt(在本例中)将是145ac26ff093c6e1317f7d5fb4c9fd11c77be975,所以输入该密码的条目将是145ac26ff093c6e1317f7d5fb4c9fd11c77be975password,根据http://howsecureismypassword.net/,破解该密码需要花费10年的时间……那么意见呢?或者我应该更糟再去
1
| $password = md5($salt.$password.md5($salt)); |
如果这个人走得够远去拿盐土豆泥,有没有什么能阻止他走得更远呢?<这最后一个密码的更多语句
对于每个说我应该为每个用户做这件事的人…我知道,这只是一个例子。
- 抱歉忘了编辑-。-
- 你可以使用PBKDF2而不是改变你的密码。
- 阅读此codingsurror.com/blog/2012/04/speed-hashing.html
- 永远,永远,永远(永远!)使用md5作为密码散列算法。Sha1也不怎么好。使用bcrypt或,正如佛罗伦萨建议的那样,PBKDF2。为什么?"它的缓慢和多轮确保攻击者必须部署大量资金和硬件才能破解您的密码"。
- codahale.com/how-to-safety-store-a-密码
您应该更改salt,使其特定于每个用户,而不是系统范围的常量。这将使彩虹表攻击您的密码散列更加不方便。
特洛伊·亨特在这篇文章中对盐渍的演变有一个很好的描述。
编辑
$salt每个密码记录都有其独特之处,这给它增加了许多熵。这通常是一个随机的字节序列,存储在用户帐户中。
哈希传统上是在salt+password的串联上进行的。
1
| $passwordHash = hash($salt.$password); |
正如其他人所说,不要使用MD5进行散列。它坏了。
不建议在散列之前对密码或salt应用其他专有算法。相反,请看一个行业级解决方案,如pbkdf2,它除了盐化之外,还需要多次(通常大于10 k)重复迭代,这将进一步减慢攻击者的速度。
如果采用OWASP准则,则应定期增加执行的哈希数(以抵消摩尔定律)。每个用户的哈希数也应该保持不变,这意味着您需要存储哈希密码、salt和迭代次数的三倍。
- 检查版谢谢,但我知道注:
- 我认为这是最好的答案,因为对我来说,这似乎不清楚为什么他会用密码使用盐。如果你使用固定盐,那就不重要了,如果要用3万亿年的粗力破解密码,因为攻击者只会看你的数据库表格,看有3000个密码,同一个有价值,并猜测密码必须是密码或12345或任何其他。你使用动态有那么大的缺陷和密码可能不会被统计方法所警戒的You use dynamic hashed so the hashed and slated password couldn't be guessed by statistical means.
你用盐完全不正确。盐应该是不可预测的;你的盐正好相反(固定的)。由于固定散列绝对没有好处,因此您似乎还指望攻击者不知道的盐。这是通过默默无闻来定义安全,这是另一个不好的做法。
你应该做的是:
使用长度合理的不可预测字符串作为盐。从池中随机生成的8个字符的字符串(如小写/大写字母和数字)很好。
为每个用户使用不同的salt,并在每次更改密码时更改它。
从MD5(被认为是坏的)移动到另一个更适合此应用程序的哈希函数。sha-1更好,因为它不被认为是坏的;bcrypt是最好的,因为它有一个可配置的负载系数。
- 检查版谢谢,但我知道注:
- @smartlemon:please edit or remove the first lines of your question appropriately.一个小小的编辑不足以让我们知道你到底在做什么。
- 像这样?我现在觉得很好
- 嘿,不好。第一条密码线仍然显示你使用固定盐。
- SHA-1不认为它破裂,因为它不是第一个位置的关键衍生功能。沙可能就是你的意思
不要使用MD5作为散列算法,使用更安全的方法,如SHA256甚至bcrypt。
当然,如果有人进入了你的数据库,他们将无法逆转普通散列的密码或使用彩虹攻击等技术。
http://michaelwright.me/php-password-storage
http://en.wikipedia.org/wiki/bcrypt网站
- 每个人都认为这是正确的吗?我这么想?
- Sha256 is not very secure still TBH,here is also a working version of BCrypt done right with a byte range salt stackoverflow.com/questions/4795385/&hellip;
首先,您不应该直接存储MD5,您已经重新登录了它。php 5.5将引入新的方法,以便在一行中轻松地创建和验证密码,在此之前,您可以使用https://github.com/ircmaxell/password_compat(向前兼容)来生成和验证安全密码哈希。
我想这里对盐的理解是错误的。盐的概念是每个哈希都应该是唯一的。原因是,创建哈希时,某些不同的字符串可能具有相同的哈希。
在您的示例中,您也在散列密码,因此它看起来不会像:145ac26ff093c6e1317f7d5fb4c9fd11c77be975password
P.S.使用BCRYPT。它更可靠。
盐是完全随机的,与您存储的实际密码无关。
你真正应该做的是生成一个完全随机的盐,然后做
1
| $password = md5($salt.$password); |
并存储用户的用户名、salt和哈希密码。
- 别推荐你是MD5,这不重要
- 检查版谢谢,但我知道注:
- @H2CO3为什么MD5是一个疯狂的人?
- @yogesh suthar en.m.wikipedia.org/wiki/md5 350;section U1