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
相关产品推荐
相关产品推荐

