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

我肯定错过了什么.

我想为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);
上一篇:希望在PHP / MySQL应用程序中找到可用的密码腌制解决方案?


下一篇:支付模块-第三方APP如何拉取微信小程序支付(思路篇)