在MySQL SERVER 8.0中,PASSWORD函数无法正常工作。

37

在MySQL Server版本8.0.12中执行PASSWORD函数时出现错误。

我有以下查询:

SELECT * 
FROM users 
WHERE login = 'FABIO' 
  AND pwd = PASSWORD('2018') 
LIMIT 0, 50000

我遇到了这个错误:

错误代码:1064。您的SQL语法有误,请查看与您的MySQL服务器版本相对应的手册,以获取正确的语法


你的 MySQL 版本是什么? - Madhur Bhaiya
你确定查询字符串中没有任何在 select 之前的内容吗? - Uueerdo
1
@MadhurBhaiya MySQL服务器版本为8.0.12。 - Fabio C
1
@FabioC,这个函数在MySQL 8.0版本中不存在。 - Madhur Bhaiya
你本来就不应该使用PASSWORD()函数来设置自己的密码。该函数的手册多年来一直指出它仅用于MySQL系统表。请改用SHA2()函数代替。SHA2() - Bill Karwin
Bcrypt是当前密码哈希的行业标准。SHA2旨在成为一种快速哈希算法,但更有可能是bcrypt经得起时间考验。此外,它还具有种子生成功能,因此您不必考虑这个问题。 - Evert
4个回答

71
如果需要一个替换哈希来匹配 password() 函数,请使用以下代码:SHA1(UNHEX(SHA1()));
例如:
mysql> SELECT PASSWORD('mypass');
+-------------------------------------------+
| PASSWORD('mypass')                        |
+-------------------------------------------+
| *6C8989366EAF75BB670AD8EA7A7FC1176A95CEF4 |
+-------------------------------------------+

并且在版本8中能够给出与替代物相同的答案:

mysql> SELECT CONCAT('*', UPPER(SHA1(UNHEX(SHA1('mypass')))));
+-------------------------------------------------+
| CONCAT('*', UPPER(SHA1(UNHEX(SHA1('mypass'))))) |
+-------------------------------------------------+
| *6C8989366EAF75BB670AD8EA7A7FC1176A95CEF4       |
+-------------------------------------------------+

5
为什么要踩?这个回答针对那些因为被锁定在特定版本中而无法控制,但又在寻找替代 PASSWORD 的人。 - rayzinnz
7
开始的星号代表在输出结果前添加一个星号,这是为了标识该字符串经过了 SHA1 加密并使用大写字母表示。以上 SQL 语句会将字符串 'mypass' 进行两次 SHA1 加密,并将结果转换为大写字母后,在开头添加一个星号作为最终结果。 - MrBlack
@MrBlack 似乎需要使用星号,因为 PASSWORD(...) 会产生一个带有一个前置星号的字符串。 - tom_mai78101
@tom_mai78101 是的,我已经将它添加到答案中了。最初确实漏掉了。 - MrBlack

25
请查看@rayzinnz的答案,以获取PASSWORD()的直接替换方法。
很多人可能会在谷歌中搜索此问题/答案,以寻找设置或重置密码的方法。在MySQL 8.0.22中,我需要执行以下操作:
  1. 更新 /etc/mysql/my.cnf 文件并添加以下内容:

     [mysqld]
    
     skip-grant-tables
    
  2. 重启 MySQL 并清除特定用户的 authentication_string:

     > systemctl restart mysql
     > sudo mysql
     mysql> UPDATE mysql.user SET authentication_string=null WHERE User='root';
     FLUSH PRIVILEGES;
     mysql> exit;
    
  3. 重新登录并更新密码:

     > mysql -u root
     mysql> ALTER USER 'root'@'localhost' IDENTIFIED WITH caching_sha2_password BY 'my password';
     mysql> FLUSH PRIVILEGES;
    
  4. 更新 /etc/mysql/my.cnf 文件并删除 skip-grant-tables 行:

     > systemctl restart mysql
    
  5. 最后,测试:

     > mysql -u root -p 
    

OP并不是在询问如何重置MySQL用户密码。 - Nik
真的,但我认为许多甚至大多数人会有同样的问题,目的是重置他们的密码,而不是真正关心函数本身。在这个帖子中提供两个答案并不会有什么损失(请注意22个赞)。 - Frank Forte
大多数人也想重置 MSSQL 密码,我也想在这里分享一下。无论是 Linux、Windows 还是其他系统,尽管分享你所知道的一切吧。 - Nik
在2)之后,您需要删除"skip-grant-tables"并重新启动mysql。 - Teson
@Teson,在第4步我们这样做,但你也可以在第2步之后做。 - Frank Forte
@FrankForte,如果我记得正确的话,因为启用了"skip-grant-tables",MySQL不允许我更改密码。所以第4步已经太晚了。 - Teson

23

OP 的 MySQL 服务器版本是 8.0.12。从 MySQL 文档 可知,版本 > 5.7.5PASSWORD 函数已被弃用:

本节中的信息仅适用于 MySQL 5.7.5 版本之前,仅适用于使用 mysql_native_password 或 mysql_old_password 身份验证插件的帐户。在 MySQL 5.7.5 中删除了对 pre-4.1 密码哈希的支持。这包括删除mysql_old_password 身份验证插件和 OLD_PASSWORD() 函数。此外,不能禁用 secure_auth ,也不能将 old_passwords 设置为 1。

从 MySQL 5.7.5 开始,只有关于 4.1 密码哈希和 mysql_native_password 身份验证插件的信息仍然相关。

相比于 PASSWORD 函数,你可以从这里使用更好且更安全的加密函数。有关 MySQL 服务器团队的更多详细信息,请参见此处


5
这是官方参考资料,表明该函数实际上已被删除这里 - Uueerdo
3
你知道在“PASSWORD”被替换成了什么吗? - Fabio C
1
@FabioC请检查我在底部更新的答案。 我提供了两个参考文献。已添加更高级的加密功能。 - Madhur Bhaiya
3
@MadhurBhaiya 我现在正在阅读这份文件。我将采用一种新的方式。非常感谢你。 - Fabio C

4

你可以创建一个类似于PASSWORD的函数

SET GLOBAL log_bin_trust_function_creators = 1;
delimiter $$
CREATE FUNCTION PASSWORD2 (pass_in varchar(50)) RETURNS varchar(50)
BEGIN
  declare n_pass varchar(50);
  set n_pass = CONCAT('*', UPPER(SHA1(UNHEX(SHA1(pass_in))))); 
  return n_pass;
END$$

那么

SELECT PASSWORD2("my_super_scret_password") FROM MyUserTable ....

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接