在较新版本的MySQL中,有一个可插入的身份验证系统。以前有PASSWORD函数可以生成在user.authentication_string
中找到的哈希,但是该函数在MySQL的更高版本(8.0.11 AFAICT)中已被删除。
如果我想验证用户密码(实际上没有登录-由于用户可能无法从我所在的主机登录),是否可以使用现代MySQL做到这一点? / p>
答案 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