【问题标题】:how do I create a mySQL user with hash('sha256', $salt . $password)?如何使用 hash('sha256', $salt . $password) 创建一个 mySQL 用户?
【发布时间】:2010-10-16 03:36:17
【问题描述】:

我一定是错过了什么。

我想为仅选择交易设置一个数据库用户帐户,但 mysql 不允许我在创建用户帐户时为密码选择哈希方法。

这失败了:

GRANT SELECT ON myDB.* TO 'selectuser'@'localhost' 
IDENTIFIED BY hash('sha256', 'salted-myfakelongrandompasswordstring');

ERROR 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 hash passwords salt


    【解决方案1】:

    不,您不应该使用自己的密码散列进行 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 应用程序中的用户帐户身份验证完全分开(出于多种原因,这是最佳实践)。

    是的,您需要为您的 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);
    

    【讨论】:

    • 所以最佳实践是...通过第二种查询方法“IDENTIFIED BY ...”创建数据库用户帐户,让 mySQL 在后台对该密码进行哈希处理,然后硬编码 字符串到存储在 Web 根目录之外的类中。然后对于实际的人类用户帐户密码,在将散列文字字符串传递给 mySQL 之前,在代码中使用 sha256 对这些密码进行散列 --- 然后它将重新散列散列字符串......等等,最后一点听起来是错误的。
    【解决方案2】:

    这个documentation page 好像表示MySQL没有实现sha256:

    另外,关于上述漏洞利用 sha1,有更强的版本 像 sha256、sha384、sha512 等但是 mysql 没有实现它们;他们 必须在代码中实现。

    【讨论】:

    • 在 MySQL 6.0.5 中支持 SHA2 系列哈希函数。我为此贡献了补丁! :-)
    【解决方案3】:

    ...由哈希('your_password','256')识别。这将导致 MySQL 对您的哈希密码进行哈希处理;-)

    【讨论】:

      猜你喜欢
      • 2012-12-16
      • 2011-10-31
      • 1970-01-01
      • 2016-06-11
      • 2013-06-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-03
      相关资源
      最近更新 更多