小易说IT 小易说IT

MySQL5.7 vs MySQL8.0 密码认证差异

核心一句话:5.7 默认 mysql_native_password(SHA1、无随机盐、明文通道质询应答);8.0 默认 caching_sha2_password(SHA256、带随机盐、内存缓存,非加密链路需要 RSA)

对比总表

项目

MySQL5.7(mysql_native_password)

MySQL8.0(caching_sha2_password)

默认插件

mysql_native_password

caching_sha2_password

哈希算法

SHA1(双重 SHA1:SHA1(SHA1(pwd)))

SHA256,多轮哈希 +随机盐

盐值

❌ 无独立随机盐:相同密码哈希完全一样

✅ 每个用户独立随机盐,同密码不同哈希,防彩虹表

认证流程

质询应答 Challenge-Response,明文 TCP 链路也能完成认证,不需要 SSL/RSA

首次认证:必须 SSL 或者 RSA 公钥加密传输密码;成功后服务器存入内存缓存,后续连接走缓存快速验证(不需要 RSA/SSL)

兼容性

老驱动 / 客户端广泛支持(Navicat 旧版、JDBC5.x)

老客户端 / 驱动不支持,是升级 8.0 最常见报错根源

安全等级

弱,SHA1 已被 NIST 废弃

更高,抗暴力破解、彩虹表

mysql.user 存储

固定格式 SHA1 哈希

带版本标识 + 随机盐 + SHA256 哈希字符串

版本状态

8.0.34 开始标记废弃,MySQL9 移除

8.0 原生内置,推荐默认

原理细节

1. mysql_native_password(5.7 默认)

  1. 服务端握手时下发20 字节随机 scramble

  2. 客户端:SHA1(SHA1(password)) XOR SHA1(scramble + SHA1(SHA1(password)))

  3. 客户端把结果发给服务端,服务端本地计算比对,全程不需要传原始密码,不需要 SSL

  4. 缺陷:没有独立盐,两个账号密码一样,mysql.user 里存的 hash 完全相同;SHA1 算法安全性弱

2. caching_sha2_password(8.0 默认)

  1. 密码存储:SHA256( salt + SHA256(password) ),每个用户 salt 不同

  2. 首次认证:

    • 链路没有 SSL 时,客户端需要用服务端 RSA 公钥加密原始密码发给服务端;

    • 有 SSL 则直接走加密通道传输明文密码;

  3. 校验成功,服务端把这个账号的 hash 放入内存 sha2 缓存;

  4. 后续连接:直接走缓存质询应答,和 native_password 类似,不再需要 RSA/SSL,速度快;

  5. 缓存会随服务重启清空,重启后再次回到首次认证逻辑

注意:从 5.7 升级到 8.0,旧用户不会自动修改插件,仍然是 mysql_native_password;只有新建用户才默认 caching_sha2_password

实操常见问题

问题 1:旧客户端连不上 MySQL8.0(最经典)

报错类似:Client does not support authentication protocol requested by server; consider upgrading MySQL client 原因:客户端库不支持caching_sha2_password

临时兼容方案(生产谨慎,降低安全性):把用户改成 native 密码

ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '你的密码';
FLUSH PRIVILEGES;

或者 my.cnf 全局修改默认新建用户插件:

default-authentication-plugin=mysql_native_password

问题 2:caching_sha2_password 非 SSL 连接

  • 不使用 SSL 连接 8.0 新账号,必须拿到服务端 RSA 公钥,客户端配置公钥文件;

  • JDBC 连接串示例:

jdbc:mysql://127.0.0.1:3306/db?allowPublicKeyRetrieval=true

allowPublicKeyRetrieval=true 生产环境不推荐,存在中间人风险,优先开启 SSL。

其他补充

  1. MySQL8.0 还保留sha256_password插件:SHA256,但没有内存缓存,每次都需要 SSL/RSA,性能差,不推荐;

  2. mysql_native_password在 MySQL8.0.34 deprecated,未来大版本会移除,长期建议迁移 caching_sha2_password;

  3. 密码策略:8.0 validate_password 默认更严格,5.7 默认宽松。

一句话总结

5.7 的 native 密码简单、兼容性好、安全弱,裸网直接质询认证;8.0 caching_sha2_password 用 SHA256 加盐,第一次认证必须加密传输,之后靠内存缓存提速,安全性更高,但老驱动会连不上。