如何在更新版本的MySQL中以编程方式验证密码?

时间:2019-03-13 20:01:05

标签: mysql authentication passwords

在较新版本的MySQL中,有一个可插入的身份验证系统。以前有PASSWORD函数可以生成在user.authentication_string中找到的哈希,但是该函数在MySQL的更高版本(8.0.11 AFAICT)中已被删除。

如果我想验证用户密码(实际上没有登录-由于用户可能无法从我所在的主机登录),是否可以使用现代MySQL做到这一点? / p>

1 个答案:

答案 0 :(得分:1)

  

如果我想验证用户密码(无需实际登录   在-由于用户可能无法从我所在的主机登录   上),有没有办法使用现代MySQL做到这一点?

nil函数接缝与使用此SQL PASSWORD(..)

相同

我不知道您将密码用于何处,但您不应将其用作应用程序的密码。

  

注意

     

CONCAT('*', UPPER(SHA1(UNHEX(SHA1(..)))))由MySQL Server中的身份验证系统使用;您   不应在您自己的应用程序中使用它。为此,考虑   一种更安全的方法

查询

PASSWORD()

结果

  SELECT
        PASSWORD('password')
      , CONCAT('*', UPPER(SHA1(UNHEX(SHA1('password'))))) 
      , PASSWORD('password') = CONCAT('*', UPPER(SHA1(UNHEX(SHA1('password')))));

请参阅demo

更好的测试接缝来确认它。

查询

| PASSWORD('password')                      | CONCAT('*', UPPER(SHA1(UNHEX(SHA1('password'))))) | PASSWORD('password') = CONCAT('*', UPPER(SHA1(UNHEX(SHA1('password'))))) |
| ----------------------------------------- | ------------------------------------------------- | ------------------------------------------------------------------------ |
| *2470C0C06DEE42FD1618BB99005ADCA2EC9D1E19 | *2470C0C06DEE42FD1618BB99005ADCA2EC9D1E19         | 1                                                                        |

结果

SELECT
   HEX(number_generator.number) AS 'password'
 , PASSWORD(HEX(number_generator.number))
 # notice that HEX(number_generator.number) below is the "password" here             
 , CONCAT('*', UPPER(SHA1(UNHEX(SHA1( HEX(number_generator.number) ))))) 
 , PASSWORD(HEX(number_generator.number)) = CONCAT('*', UPPER(SHA1(UNHEX(SHA1( HEX(number_generator.number) )))))                                  
FROM (                                                                 
  SELECT 
   @row := @row + 1 AS number
  FROM (
    SELECT 0 UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9
  ) row1
  CROSS JOIN (
    SELECT 0 UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9
  ) row2
  CROSS JOIN (
    SELECT @row := 0 
  ) init_user_params
) AS number_generator 

请参见demo