4

我肯定错过了什么。

我想为仅选择事务设置数据库用户帐户,但 mysql 不允许我在创建用户帐户时为密码选择哈希方法。

这失败了:

GRANT SELECT ON myDB.* TO 'selectuser'@'localhost' 
IDENTIFIED BY hash('sha256', 'salted-myfakelongrandompasswordstring');

ERROR 1064 (42000):您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 1 行的 'hash('sha256', 'salted-myfakelongrandompasswordstring')' 附近使用正确的语法

这通过了:

GRANT SELECT ON myDB.* TO 'selectuser'@'localhost' 
IDENTIFIED BY 'salted-myfakelongrandompasswordstring';

我检查了 phpinfo 页面并且已经启用了 sha256 哈希引擎。

有没有办法更改 mysql 的默认散列算法,或者我的 SQL 上的语法不正确?

4

3 回答 3

4

不,您不应该使用自己的密码散列进行 MySQL 身份验证。

MySQL 使用自己的密码散列函数 ( PASSWORD()),它产生一个 41 字节的十六进制字符串(基于两次将 SHA1 应用于输入)。不幸的是,没有使用盐。

如果您能够GRANT以您在问题中显示的方式使用,那么 MySQL 会将其PASSWORD()函数应用于函数的字符串输出hash()。随后,当您想登录时,您必须输入密码的 256 位哈希,以使其与 MySQL 身份验证数据库中的内容相匹配。

此外,MySQL 支持从SHA2()MySQL 6.0.5 开始的哈希函数系列。

hash()函数可能是您从 PHP 中记住的。它不是 MySQL 的一部分。


更新:我本周参加了 MySQL 会议,发现他们正在完全改变未来产品版本号的路线图。该SHA2()函数目前是 MySQL 源代码的一部分,但尚未确定对应的产品版本。此外,您需要使用 OpenSSL/YaSSL 支持构建的 MySQLSHA2()才能正常工作。


回复您的评论:通常 MySQL 身份验证与给定 Web 应用程序中的用户帐户身份验证完全分开(出于多种原因,这是最佳实践)。

是的,您需要为 Web 应用程序的 MySQL 身份验证硬编码用户名/密码。可能在,但更好的是配置文件。当然,将这些放在 web 根目录之外。

当用户需要登录时,计算hash()他们的输入密码,并结合他们帐户记录的值。然后将其与该用户存储在数据库中的哈希值进行比较。在伪代码中:

$salt = $db->query("SELECT salt FROM Accounts WHERE account_name = ?", 
    $input_account_name);

$password_hash = hash('sha256', $salt + $input_password)

$is_password_correct = $db->query("SELECT password_hash = ? 
    FROM Accounts WHERE account_name = ?",
    $password_hash, $input_account_name);
于 2009-03-28T19:10:02.643 回答
1

文档页面似乎表明 sha256 未在 MySQL 中实现:

另外,关于sha1的exploit,还有sha256、sha384、sha512等更强的版本,但是mysql没有实现它们;它们必须在代码中实现。

于 2009-03-28T19:01:15.613 回答
-1

...通过哈希('your_password','256')识别。这将导致 MySQL 对您的哈希密码进行哈希处理;-)

于 2020-09-24T15:19:50.600 回答