我一定错过了什么。
我想为select-only事务设置数据库用户帐户,但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语法是否正确?
答案 0 :(得分:4)
不,您不应该使用自己的密码哈希进行MySQL身份验证。
MySQL使用自己的密码散列函数(PASSWORD()
),它产生一个41字节的十六进制字符串(基于将SHA1应用于输入两次)。不幸的是,没有使用盐。
如果您能够以问题中显示的方式使用GRANT
,那么MySQL会将PASSWORD()
函数应用于hash()
函数的字符串输出。随后,当您要登录时,您必须输入密码的256位哈希值,以使其与MySQL身份验证数据库中的匹配。
此外,从MySQL 6.0.5开始,MySQL支持SHA2()
系列哈希函数。
hash()
函数是你可能从PHP中记住的东西。它不是MySQL的一部分。
SHA2()
函数目前是MySQL源代码的一部分,但它未确定对应的产品版本。此外,您需要使用OpenSSL / YaSSL支持构建的MySQL,以便SHA2()
能够正常工作。
重新评论:通常,MySQL身份验证与给定Web应用程序中的用户帐户身份验证完全分开(出于多种原因,这是最佳做法)。
是的,您需要为您的网络应用程序硬编码MySQL身份验证的用户名/密码。可能在,但更好的是配置文件。当然,把这些放在网络根目录之外。
当用户需要登录时,计算其输入密码的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);
答案 1 :(得分:1)
这个documentation page似乎表明sha256没有在MySQL中实现:
另外,关于上述漏洞利用 sha1,有更强的版本 像sha256,sha384,sha512等但是 mysql没有实现它们;他们 必须在代码中实现。
答案 2 :(得分:-1)
...由哈希('your_password','256')标识。这将导致MySQL哈希您的哈希密码;-)