如何使用hash('sha256', $salt . $password)创建一个mySQL用户?

4

我可能漏掉了什么。

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

这个失败了:

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

错误 1064 (42000): 在你的SQL语法中有一个错误;请检查与你的MySQL服务器版本相对应的手册,以获取正确的语法,位于第1行附近的位置为'hash('sha256', 'salted-myfakelongrandompasswordstring')'

这个通过:

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

我检查了phpinfo页面,发现sha256哈希引擎已经启用。 是否有一种方法可以更改mysql的默认哈希算法,还是我的SQL语法不正确?
3个回答

5
不,你不应该在MySQL身份验证中使用自己的密码哈希。
MySQL 5.x使用自己的哈希函数(PASSWORD()),它产生一个41字节的十六进制字符串(基于将SHA1应用于输入两次)。不幸的是,没有使用盐。
如果你能够按照你在问题中展示的方式使用GRANT,那么MySQL会将其PASSWORD()函数应用于hash()函数的字符串输出。随后,当你想要登录时,你必须输入你的密码的256位哈希值,以使其与MySQL身份验证数据库中的内容匹配。
此外,MySQL从MySQL 5.5开始支持SHA2()哈希函数系列。 hash()函数可能是你在PHP中记得的某个函数。它不是MySQL的一部分。

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

是的,您需要为Web应用程序硬编码MySQL身份验证的用户名/密码。可以在其中,但最好是在配置文件中。当然,将它们放在Web根目录之外。

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

$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);

最佳实践是通过第二个查询方法“IDENTIFIED BY ...<literal password>”创建数据库用户帐户,让mySQL在后台对该密码进行哈希处理,然后将<literal password>字符串硬编码到存储在Web根目录之外的类中。然后,对于实际的人类用户帐户密码,在传递哈希的字面字符串到mySQL之前,在代码中使用sha256进行哈希处理...等等,最后一部分听起来不太对。 - OldBuildingAndLoan

1

这个文档页面似乎表明MySQL没有实现sha256:

此外,关于提到的sha1漏洞, 还有更强大的版本,如sha256, sha384,sha512等,但 MySQL 没有 实现它们;它们必须在代码中实现。


1
SHA2哈希函数系列在MySQL 6.0.5中得到支持。我为此贡献了补丁! :-) - Bill Karwin

-1

...通过hash('your_password','256')进行身份验证。这将导致MySQL对您的哈希密码进行再次哈希 ;-)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接