You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MySQL 5.7 PASSWORD()函数底层解析及5.5至5.7迁移算法问询

MySQL 5.7创建用户时PASSWORD()函数的加密算法解析(针对5.5迁移场景)

我刚好处理过从MySQL 5.5迁移到5.7的场景,关于你问的创建用户时隐式调用PASSWORD()的算法细节,结合你的测试情况给你拆解清楚:

1. 默认场景(old_passwords=0)

当你启动5.7.19实例后,执行SHOW VARIABLES LIKE '%old_passwords%';得到值为0,这是MySQL 5.7的默认配置,对应mysql_native_password插件的加密逻辑:

  • 你测试发现SELECT PASSWORD('mypass');和SELECT UPPER(SHA1(UNHEX(SHA1('mypass'))));返回结果一致,这是因为此时PASSWORD()函数采用的是双SHA1加密算法:先对明文密码做一次SHA1哈希,将结果转为二进制(UNHEX)后再做一次SHA1,最后把结果转成大写十六进制字符串。
  • 注意:实际创建用户时,MySQL会额外加入随机生成的盐值,最终存储在mysql.user表的authentication_string字段里的哈希是带盐的版本,但PASSWORD()函数本身直接调用时是不带盐的双SHA1,这就是你测试结果匹配的原因。

2. 当old_passwords=2时的情况

当你把old_passwords设置为2后,PASSWORD()函数会切换为SHA256加密算法,对应MySQL的sha256_password插件:

  • 此时PASSWORD()生成的哈希会遵循RFC 7677的标准,包含随机盐值,所以每次调用PASSWORD('mypass')返回的结果都会不一样(因为盐值随机)。
  • 这种算法的安全性比双SHA1更高,但需要注意的是,使用该算法的用户在连接时需要SSL/TLS加密,否则MySQL会拒绝连接(除非你开启了sha256_password_private_key_path等相关配置支持无SSL的RSA加密连接)。

另外补充一点:MySQL 5.5默认使用的就是双SHA1的mysql_native_password算法,所以如果你的5.5实例没有启用旧版的pre-4.1密码(old_passwords=1),那么迁移到5.7后默认的old_passwords=0配置是完全兼容的,不需要额外调整密码算法。


内容的提问来源于stack exchange,提问作者gokan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 07:18:07