所以,我在 SO 上发现您应该将密码与“盐”一起散列。 (文章可以在here和here找到。)
代码如下:
$password = 'fish';
/* should be "unique" for every user? */
$salt= 'ABC09';
$site_key = 'static_site_key';
hash_hmac('sha1', $password . $salt, $site_key);
现在我需要在 MySQL 中同时保存 $password
和 $salt
,如下所示:
+---------+--------+----------+-------+
| user_id | name | password | salt |
+---------+--------+----------+-------+
| 1 | krysis | fish** | ABC09 |
+---------+--------+----------+-------+
** fish
当然会被散列而不是以纯文本形式存储。
而且我只是想知道这样做是否真的有意义,因为这样是黑客或任何也知道盐的人?那么,如果他们破解密码并且看到它是 fishABC09
他们会自动知道密码是 fish
?或者他可能“永远”无法破解密码,因为他不知道 secret_key
,因为它没有存储在数据库中?
如果我没有任何意义,我很抱歉。我只是一直使用 sha1
作为密码,今天我发现这些文章谈到了添加 salt
。
最佳答案
有很多关于正确存储密码的好文章。例如其中之一:Storing Passwords - done right!
您应该为每个用户使用不同的盐,但没有必要单独存储盐。参见 another thread 中的类似讨论
顺便说一下,您可能不应该使用 sha1,但例如sha256 或 sha512 更强大的东西(至少可以避免不良宣传)。对此有一个很好的答案:How insecure is a salted SHA1 compared to a salted SHA512
关于mysql - 您如何在 MySQL 中安全地存储用户的密码和盐?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7270526/