mysql - 您如何在 MySQL 中安全地存储用户的密码和盐?

标签 mysql passwords sha1

所以,我在 SO 上发现您应该将密码与“盐”一起散列。 (文章可以在herehere找到。)

代码如下:

$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/

相关文章:

java - 如何通过文本字段将 Java 变量插入到查询中?

regex - 使用组合正则表达式进行密码检查

php - 如何使用 DB insert 将 boolean 值 "false"插入为 0?

java - 从 Java 以不同的用户身份运行 UNIX 命令

hibernate - Spring Security DB 身份验证 w/Hibernate 和散列密码?

c# - 在 Java 和 C# 中计算 SHA-1 哈希

android - 什么是 SHA1 指纹?

php - Node.js 和 sha1

mysql - 如何将我的 .log 文件存入数据库或适合数据库的格式

mysql - 如何使下面的正则表达式适用于 MySql?