盐和密码[重复]

Posted

技术标签:

【中文标题】盐和密码[重复]【英文标题】:Salt and passwords [duplicate] 【发布时间】:2012-09-25 08:26:16 【问题描述】:

可能重复:Secure hash and salt for php passwords

警告不要使用 MD5 作为密码,使用 bcrypt 之类的替代方法


对于我的密码,我应该像这样使用盐吗(盐对每个用户都是唯一的,而不是直接与密码一起存储)...

$salt = sha1(md5("coders gonna code"));
$password = md5($salt.$password);

或者如果我只是使用它可以吗:

$password = md5($password);

因为如果我使用了 salt,即使用户编造了一个错误的密码(如密码)也没关系,因为 salt(在这种情况下)将是 145ac26ff093c6e1317f7d5fb4c9fd11c77be975,所以那里的密码条目将是 145ac26ff093c6e1317f7d5fb4c9fd11c77be975password根据http://howsecureismypassword.net/ 的说法,破解需要 3 个 octodecillion 年......所以意见?或者我应该更糟,然后去

$password = md5($salt.$password.md5($salt));

如果这个人已经走得足够远,可以得到盐哈希,还有什么可以阻止然后继续前进吗?


对于所有说我应该为每个用户做的人......我知道,这只是一个例子。

【问题讨论】:

抱歉忘记编辑-.- 您可以使用PBKDF2 而不是salting您的密码。 阅读此codinghorror.com/blog/2012/04/speed-hashing.html 永远,永远,永远永远 (EVER!) 使用 md5 作为您的密码哈希算法。 SHA1 也好不了多少。 Use bcrypt 或者,正如 Florent 建议的那样,PBKDF2。为什么? “它的缓慢和多轮确保攻击者必须部署大量资金和硬件才能破解您的密码”. codahale.com/how-to-safely-store-a-password 【参考方案1】:

您应该更改盐,使其特定于每个用户,而不是系统范围的常量。这将使针对您的密码哈希的彩虹表攻击更加不便。

Troy Hunt 在article 中有一篇很好的关于盐渍演变的文章。

编辑

$salt 每个密码记录都是独一无二的,这增加了很多熵。这通常是一个随机的字节序列,与用户帐户一起存储。

传统上,哈希是在salt + password 的串联上完成的。

$passwordHash = hash($salt.$password);

正如其他人所说,不要使用 MD5 进行散列。坏了。

在散列之前对密码或盐应用额外的专有算法是not recommended。相反,请查看诸如PBKDF2 之类的行业实力解决方案,除了加盐之外,它还需要多次(通常 > 10k)重复迭代,这将进一步减缓攻击者的速度。

如果您采用OWASP guidelines,则应定期增加执行的哈希数(以抵消摩尔定律)。每个用户的哈希数也应该保持不变,这意味着您需要存储哈希密码、盐和迭代次数的三元组。

【讨论】:

检查编辑。谢谢,但我知道这一点。 :) 我认为这最好地回答了这个问题,因为在我看来,OP 似乎并不清楚他为什么要在密码中使用盐。如果您使用固定盐,那么暴力破解密码是否需要 30 亿年也没关系,因为攻击者只会查看您的数据库表,看到有 3000 个具有相同哈希值的密码和猜测它必须是“密码”或“12345”或其他什么。您使用动态哈希,因此无法通过统计方法猜出经过哈希处理的密码。【参考方案2】:

您完全错误地使用了盐。盐应该是不可预测的;你的盐正好相反(固定)。由于固定哈希绝对没有任何好处,因此您似乎还指望攻击者不知道盐。这是通过默默无闻的安全定义,这是另一种不好的做法。

你应该做的是:

    使用不可预测的合理长度字符串作为盐。从池中随机生成 8 个字符的字符串,例如小写/大写字母和数字。 为每个用户使用不同的盐,并在他们每次更改密码时进行更改。 从 MD5(被认为是损坏的)移动到另一个更适合此应用程序的哈希函数。 SHA-1 更好,因为它不被认为是损坏的; bcrypt 是最好的,因为它具有可配置的负载因子。

【讨论】:

检查编辑。谢谢,但我知道这一点。 :) @SmartLemon:请适当编辑或删除您问题的第一行。一个小的修改不足以让我们知道你在做什么。 喜欢吗?我觉得现在可以了 @SmartLemon:嗯,不,这不行。第一行代码仍然显示您使用的是固定盐。 SHA-1 不被认为是损坏的,因为它首先不是密钥派生函数。 PKBDF2-SHA 可能是你的意思..【参考方案3】:

    不要使用MD5 作为散列算法,使用更安全的算法,例如SHA256 甚至bcrypt

    一定要加盐密码,如果有人确实获得了您数据库的访问权限,他们将无法使用常见哈希或彩虹攻击等技术来反转密码。

http://michaelwright.me/php-password-storage

http://en.wikipedia.org/wiki/Bcrypt

【讨论】:

大家觉得这样对吗?我想是的? Sha256 仍然不是很安全,这里也是 bcrypt 的工作版本,使用字节范围 salt ***.com/questions/4795385/…【参考方案4】:

首先,您永远不应该直接存储 md5,您已经识别了它。 PHP 5.5 将带来在 1 行中轻松创建和验证密码的新方法,在此之前您可以使用 https://github.com/ircmaxell/password_compat(向前兼容)来生成和验证安全密码哈希。

【讨论】:

【参考方案5】:

我认为这里对盐的理解有误。盐的想法是每个哈希应该是唯一的。原因是当您创建哈希时,一些不同的字符串可能具有相同的哈希。

在您的示例中,您也在对密码进行哈希处理,因此它看起来不会像:145ac26ff093c6e1317f7d5fb4c9fd11c77be975password

附:使用 bcrypt。它更可靠。

【讨论】:

【参考方案6】:

盐是完全随机的,与您存储哈希的实际密码无关。

你真正应该做的是生成一个完全随机的盐,然后做

$password = md5($salt.$password);

并存储用户的用户名、盐和哈希密码。

【讨论】:

不要推荐MD5,它不安全。 检查编辑。谢谢,但我知道这一点。 :) @Yogesh Suthar en.m.wikipedia.org/wiki/MD5#section_1

以上是关于盐和密码[重复]的主要内容,如果未能解决你的问题,请参考以下文章

在 Python 中加盐和散列密码

[Sql-Server]密码盐和哈希值使用啥数据类型以及啥长度?

用于登录密码的 PHP 盐和哈希 SHA256

如果数据库是可访问的,那么盐和散列的意义何在?

MySQL密码功能

Python密码盐渍和胡椒