在 MySQL 中,PASSWORD() 函数使用的加密算法取决于 MySQL 版本:

MySQL 版本与加密算法对应关系

1. MySQL 4.1+ 版本

算法:双层 SHA-1 哈希

mysql> SELECT PASSWORD('123456');
-- 返回示例:*6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9

加密过程

  1. 生成 SHA-1 哈希:SHA1('123456')
  2. 再次生成 SHA-1 哈希:SHA1(SHA1('123456'))
  3. 添加 * 前缀

2. MySQL 4.1 之前版本

算法:老式的 16 字节哈希(已过时)

验证示例

-- 在 MySQL 中验证
SELECT PASSWORD('123456');
SELECT SHA1('123456');
SELECT SHA1(SHA1('123456'));

在 Linux 中重现 MySQL PASSWORD()

# 第一步:计算 SHA1
echo -n "123456" | sha1sum
# 输出:7c4a8d09ca3762af61e59520943dc26494f8941b

# 第二步:计算 SHA1(SHA1()),注意要去掉换行符
echo -n "123456" | sha1sum | cut -d' ' -f1 | xxd -r -p | sha1sum
# 输出:6bb4837eb74329105ee4568dda7dc67ed2ca2ad9

# 完整命令(添加 * 前缀)
echo -n "123456" | sha1sum | cut -d' ' -f1 | xxd -r -p | sha1sum | cut -d' ' -f1 | awk '{print "*" toupper($1)}'
# 输出:*6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9

重要注意事项

1. PASSWORD() 函数已弃用

-- MySQL 5.7.6+ 中,PASSWORD() 已弃用
-- MySQL 8.0+ 中,PASSWORD() 已移除

-- 替代方案:使用更安全的认证方式
ALTER USER 'username'@'host' IDENTIFIED BY 'new_password';

2. 现代 MySQL 的密码认证

  • mysql_native_password:使用 SHA1(SHA1())(与 PASSWORD() 相同)
  • caching_sha2_password:MySQL 8.0 默认,使用 SHA-256
  • sha256_password:使用 SHA-256

3. 检查当前认证插件

SELECT user, host, plugin FROM mysql.user;

安全建议

  1. 不要使用 PASSWORD()
-- 错误用法(不安全)
SET PASSWORD = PASSWORD('123456');

-- 正确用法
ALTER USER 'user'@'host' IDENTIFIED BY '123456';
  1. 升级到更安全的认证插件
ALTER USER 'user'@'host' IDENTIFIED WITH caching_sha2_password BY 'password';
  1. 密码强度策略
-- 检查密码策略
SHOW VARIABLES LIKE 'validate_password%';

总结

  • MySQL 4.1+ 的 PASSWORD():使用 SHA1(SHA1(password)) 算法
  • 40字符哈希:结果是 20 字节的十六进制表示(40字符)
  • 现代替代:建议使用 MySQL 的用户管理语句而非 PASSWORD() 函数