在 MySQL 中对密码进行加盐和散列处理

tre*_*005 5 mysql passwords cryptography

我正在寻找一种使用盐存储和验证 mysql 密码的方法。我无法访问 PHP 或任何其他加密软件。我知道 PASSWORD() 函数,但这不允许使用盐。

还有其他选择吗?

Mar*_*ams 3

我认为既然您谈论的是盐,那么您真正指的是散列,这是单向加密的一种形式,而不是加密。哈希保证给定的输入值始终产生相同的输出值。使用安全散列算法,除了尝试散列函数中的每个明文值之外,没有更好的方法来导出原始明文。

虽然 SHA1 可能足以保护许多系统的密码,但肯定有更好的哈希算法。然而,SHA1 在 MySQL 中可用。

虽然SHA1()MySQL 函数不接受单独的 salt 参数,但您仍然可以对密码进行 salt 处理。事实上,据我所知,大多数哈希函数都没有单独的盐参数。

要对明文值加盐,只需将随机字符串连接到明文值的开头即可。不幸的是,MySQL 没有直接的方法来生成随机字符串,但这将使您接近。

要生成 6 个字符(仅限十六进制值)随机字符串:

SELECT SUBSTRING(SHA1(RAND()), 1, 6) AS salt
Run Code Online (Sandbox Code Playgroud)

当然,重要的是你必须始终保存盐。你会再次需要它。

保存盐后,只需对密码进行哈希处理,如下所示:

SELECT SHA1(CONCAT(salt, 'password')) AS hash_value
Run Code Online (Sandbox Code Playgroud)

通常通过在哈希值前加上盐作为前缀,将盐和哈希密码存储在同一列中。

要验证输入的密码,只需重复该过程即可。将存储的盐作为明文密码的前缀,对连接的字符串进行哈希处理,然后将生成的哈希值与存储的密码哈希值进行比较。

每个记录应该有不同的随机盐。