m42*_*m42 4 mysql passwords hash salt
我肯定错过了什么。
我想为仅选择事务设置一个数据库用户帐户,但 mysql 不允许我在创建用户帐户时选择密码的哈希方法。
这失败了:
GRANT SELECT ON myDB.* TO 'selectuser'@'localhost'
IDENTIFIED BY hash('sha256', 'salted-myfakelongrandompasswordstring');
Run Code Online (Sandbox Code Playgroud)
ERROR 1064 (42000):您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,了解在第 1 行 'hash('sha256', 'salted-myfakelongrandompasswordstring')' 附近使用的正确语法
这通过了:
GRANT SELECT ON myDB.* TO 'selectuser'@'localhost'
IDENTIFIED BY 'salted-myfakelongrandompasswordstring';
Run Code Online (Sandbox Code Playgroud)
我检查了 phpinfo 页面,sha256 哈希引擎已经启用。
有没有办法更改 mysql 的默认哈希算法,或者我的 SQL 语法是否不正确?
不,您不应该使用自己的密码哈希进行 MySQL 身份验证。
MySQL 5.x 使用自己的哈希函数 ( PASSWORD()),该函数生成 41 字节的十六进制字符串(基于对输入应用两次 SHA1)。不幸的是,没有使用盐。
如果您能够GRANT按照问题中所示的方式使用,那么 MySQL 会将其PASSWORD()函数应用于该函数的字符串输出hash()。随后,当您想要登录时,您必须输入密码的 256 位哈希值,以使其与 MySQL 身份验证数据库中的内容相匹配。
SHA2()此外,从 MySQL 5.5 开始,MySQL 支持哈希函数系列。
hash()您可能还记得 PHP 中的某个函数。它不是 MySQL 的一部分。
回复您的评论:通常,MySQL 身份验证与给定 Web 应用程序中的用户帐户身份验证完全分开(出于多种原因,这是最佳实践)。
是的,您需要对 Web 应用程序的 MySQL 身份验证的用户名/密码进行硬编码。可以,但更好的是配置文件。当然,将它们放在网络根目录之外。
当用户需要登录时,计算hash()他们输入的密码,结合其帐户记录的盐值。然后将其与该用户数据库中存储的哈希值进行比较。在伪代码中:
$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);
Run Code Online (Sandbox Code Playgroud)