核心一句话:5.7 默认
mysql_native_password(SHA1、无随机盐、明文通道质询应答);8.0 默认caching_sha2_password(SHA256、带随机盐、内存缓存,非加密链路需要 RSA)
对比总表
原理细节
1. mysql_native_password(5.7 默认)
服务端握手时下发20 字节随机 scramble
客户端:
SHA1(SHA1(password)) XOR SHA1(scramble + SHA1(SHA1(password)))客户端把结果发给服务端,服务端本地计算比对,全程不需要传原始密码,不需要 SSL
缺陷:没有独立盐,两个账号密码一样,mysql.user 里存的 hash 完全相同;SHA1 算法安全性弱
2. caching_sha2_password(8.0 默认)
密码存储:
SHA256( salt + SHA256(password) ),每个用户 salt 不同首次认证:
链路没有 SSL 时,客户端需要用服务端 RSA 公钥加密原始密码发给服务端;
有 SSL 则直接走加密通道传输明文密码;
校验成功,服务端把这个账号的 hash 放入内存 sha2 缓存;
后续连接:直接走缓存质询应答,和 native_password 类似,不再需要 RSA/SSL,速度快;
缓存会随服务重启清空,重启后再次回到首次认证逻辑
注意:从 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。
其他补充
MySQL8.0 还保留
sha256_password插件:SHA256,但没有内存缓存,每次都需要 SSL/RSA,性能差,不推荐;mysql_native_password在 MySQL8.0.34 deprecated,未来大版本会移除,长期建议迁移 caching_sha2_password;密码策略:8.0 validate_password 默认更严格,5.7 默认宽松。
一句话总结
5.7 的 native 密码简单、兼容性好、安全弱,裸网直接质询认证;8.0 caching_sha2_password 用 SHA256 加盐,第一次认证必须加密传输,之后靠内存缓存提速,安全性更高,但老驱动会连不上。