我肯定错过了什么.
我想为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语法是否正确?
解决方法:
不,您不应该使用自己的密码哈希进行MySQL身份验证.
MySQL使用自己的密码散列函数(PASSWORD()
),它产生一个41字节的十六进制字符串(基于将SHA1应用于输入两次).不幸的是,没有使用盐.
如果您能够以问题中显示的方式使用GRANT,那么MySQL会将其PASSWORD()函数应用于hash()函数的字符串输出.随后,当您要登录时,您必须输入密码的256位哈希值,以便与MySQL身份验证数据库中的内容进行匹配.
此外,MySQL支持MySQL 6.0.5中的SHA2()
系列哈希函数.
hash()
函数是你可能从PHP中记住的东西.它不是MySQL的一部分.
更新:本周我参加了MySQL大会,发现他们正在完全改变未来产品版本号的路线图. SHA2()函数目前是MySQL源代码的一部分,但它未确定对应的产品版本.此外,您需要使用OpenSSL / YaSSL支持构建的MySQL,以便SHA2()能够正常工作.
重新评论:通常,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);