caching_sha2_password 更难被离线破解,因其采用 pbkdf2-sha256(salt+5000次迭代)替代 mysql_native_password 的无盐无迭代 sha1(sha1(password)),大幅增加暴力破解成本。

为什么 caching_sha2_password 比 mysql_native_password 更难被离线破解
核心在于它强制引入了密钥派生函数(KDF)和盐值,把密码哈希从单次 SHA256 计算升级为带迭代次数的 PBKDF2-SHA256。攻击者拿到 mysql.user 表里的 authentication_string 字段后,无法直接比对哈希,必须先暴力猜测明文密码,再用相同的 salt 和 5000 轮迭代重新计算——这大幅拖慢爆破速度。
- mysql_native_password 使用的是
SHA1(SHA1(password)),无 salt、无迭代,GPU 可每秒尝试上亿次 - caching_sha2_password 存储的是
PBKDF2_SHA256(salt, password, iterations=5000),salt 随用户随机生成,且 iteration 数可配置(默认 5000,MySQL 8.0.29+ 支持调高) - 客户端连接时,服务端不发送 salt 给客户端;而是由客户端用自己缓存的 salt(首次登录后保存在内存或本地文件)参与计算,减少中间人获取 salt 的机会
caching_sha2_password 的握手流程如何防止明文密码泄露
它采用基于 RSA 的安全协商机制,避免密码在传输中暴露,尤其在未启用 TLS 的场景下仍能提供基础保护。关键点是:服务端用私钥加密一个随机 nonce,客户端用公钥解密后,把密码派生出的密钥用于后续响应签名,全程不传原始密码或其哈希。
- 若服务端配置了
sha256_password_public_key_path,则启用 RSA 加密通道;否则降级为明文传输(此时安全性等同于未加密连接) - 客户端必须支持
caching_sha2_password插件(如 MySQL 8.0+ 官方客户端、Connector/J 8.0.12+),旧版 JDBC 驱动会报错Public Key Retrieval is not allowed - 当连接启用了 TLS 时,RSA 协商会被跳过,直接走 TLS 加密信道,此时
caching_sha2_password的 RSA 步骤不触发
实际部署中哪些配置会悄悄削弱它的安全性
很多 DBA 启用了插件却没配配套参数,导致安全机制形同虚设。最常见的是忽略公钥路径、关闭缓存、或误设 authentication_policy。
Word报告自动生成神器。自动生成专业Word文档报告,支持模板填充、目录生成、表格/图表插入、页眉页脚、多级标题、样式主题、批量邮件合并。当用户需要生成Word报告、创建合同文档、批量生成通知/证书、填充Word模板、制作商业计划书时触发。
- 未设置
sha256_password_public_key_path或caching_sha2_password_public_key_path:RSA 协商失效,退化为明文发送 password hash(仅限非 TLS 连接) - 把
caching_sha2_password_auto_generate_rsa_keys设为 OFF 且未手动提供密钥对:服务端无法完成 RSA 加密,客户端连接失败或降级 - 将用户
authentication_policy设为''(空字符串)或mysql_native_password:覆盖全局插件设置,该用户完全绕过新机制 - 客户端连接串里加了
allowPublicKeyRetrieval=true:虽能连上,但允许服务端把公钥发给客户端,增加中间人窃取公钥并伪造响应的风险
如何验证当前连接是否真正启用了完整安全链路
不能只看 user.authentication_plugin 是不是 caching_sha2_password,得确认握手阶段是否走了 RSA 加密 + PBKDF2 派生 + TLS 三重保障。最直接的方式是抓包 + 查状态变量。
- 执行
SHOW STATUS LIKE 'Ssl%';确认Ssl_cipher非空 → TLS 已启用 - 执行
SELECT user, host, plugin FROM mysql.user WHERE user = 'xxx';确认 plugin 是caching_sha2_password - 开启 general_log 后观察连接日志:若出现
Authentication with caching_sha2_password started且无public key retrieval相关警告,则 RSA 协商成功 - 用 Wireshark 抓包时,若未启用 TLS,应看不到明文
password或hash字段;看到的是加密后的auth_responsepayload
真正麻烦的是混合环境:老旧应用连新库、容器内 DNS 导致公钥路径解析失败、或者运维脚本用 mysql -u -p 交互式登录却没更新客户端版本——这些地方不报错,但安全水位已经掉了一截。










