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

时间:2009-03-28 18:44:05

标签: mysql hash passwords salt

我一定错过了什么。

我想为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语法是否正确?

3 个答案:

答案 0 :(得分:4)

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

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

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

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

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


更新:本周我参加了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哈希您的哈希密码;-)