【问题标题】:In MySQL SERVER 8.0 the PASSWORD function not working在 MySQL SERVER 8.0 中,PASSWORD 功能不起作用
【发布时间】:2019-02-18 14:15:45
【问题描述】:

在 MySQL 服务器版本 8.0.12 中执行 PASSWORD 函数时出错

我有以下疑问:

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

我收到此错误:

错误代码:1064。您的 SQL 语法有错误;检查 与您的 MySQL 服务器版本相对应的手册 在附近使用的语法

【问题讨论】:

  • 你的mysql版本是多少?
  • 您确定查询字符串中的 select 之前没有任何内容吗?
  • @MadhurBhaiya mysql 服务器版本为 8.0.12
  • @FabioC MySQL 8.0版本没有这个功能
  • 无论如何,您都不应该将 PASSWORD() 函数用于您自己的密码。该函数的手册多年来一直说它仅供 MySQL 的系统表使用。请改用SHA2()

标签: mysql mysql-8.0


【解决方案1】:

如果您需要替换哈希来匹配 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       |
+-------------------------------------------------+

【讨论】:

  • 为什么投反对票?当人们被锁定到无法控制的特定版本时,这回答了寻找 PASSWORD 替代品的人的问题。
  • 开头的星号怎么样? SELECT CONCAT('*', UPPER(SHA1(UNHEX(SHA1('mypass')))))
  • @MrBlack 似乎需要星号,因为PASSWORD(...) 会生成带有前导单个星号的字符串文字。
  • @tom_mai78101 是的,我将它添加到答案中,最初它被遗漏了
【解决方案2】:

OP 的 MySQL 服务器版本是 8.0.12。从MySQL Documentation 开始,PASSWORD 函数已被 version > 5.7.5 弃用:

注意

本节中的信息仅在 MySQL 5.7.5 之前完全适用, 并且仅适用于使用 mysql_native_password 或 mysql_old_password 身份验证插件。支持 4.1 之前的版本 MySQL 5.7.5 中删除了密码哈希。这包括删除 mysql_old_password 身份验证插件和 OLD_PASSWORD() 功能。此外,secure_auth 不能被禁用,而 old_passwords 不能设置为 1。

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

除了PASSWORD 函数,您可以使用here 中更好、更安全的加密函数。更多来自 MySQL 服务器团队的细节可以查看here

【讨论】:

  • 这里的官方参考说它实际上已被删除here
  • - 你知道 PASSWORD 的位置是什么吗?
  • @FabioC 检查我在底部的更新答案。我给出了两个参考。而是添加了更高级的加密功能
  • @MadhurBhaiya 我现在正在阅读文档。我将使用一种新方法。非常感谢。
【解决方案3】:

使用 MySQL 8.0.22,我必须执行以下操作:

  1. 更新 /etc/mysql/my.cnf 并添加行:

     [mysqld]
    
     skip-grant-tables
    
  2. 重启mysql并运行一些查询:

     > 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 
    

【讨论】:

  • caching_sha2_password 为我工作,谢谢
【解决方案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 ....

【讨论】:

    猜你喜欢
    • 2021-02-12
    • 2023-04-04
    • 2017-10-11
    • 1970-01-01
    • 1970-01-01
    • 2013-12-09
    • 1970-01-01
    • 1970-01-01
    • 2023-03-16
    相关资源
    最近更新 更多