mysql 8.0默认启用caching_sha2_password是对sha-1彻底失效的回应,它通过20字节随机盐值、5000轮sha-256迭代哈希及rsa加密传输,根治离线爆破、彩虹表攻击和中间人劫持三大缺陷。

MySQL 8.0 默认启用 caching_sha2_password 不是临时调整,而是对 SHA-1 算法彻底失效的明确回应——它解决了旧插件在离线爆破、彩虹表攻击和网络中间人劫持三个维度上的根本缺陷。
为什么 mysql_native_password 已经不安全了
旧插件 mysql_native_password 的密码哈希存储在 mysql.user 表的 authentication_string 字段中,格式是 SHA1(SHA1(password)),没有盐值(salt)。这意味着:
- 相同密码 → 完全相同的哈希值,攻击者扫一眼就能判断哪些账号共用密码
- 哈希可离线暴力破解:GPU 集群几小时就能跑完常见密码字典
- 握手过程虽不传明文,但 challenge-response 交换数据可被截获重放,尤其在未强制 SSL 的连接中
NIST 早在 2011 年就正式弃用 SHA-1,Google 在 2017 年实现实际碰撞攻击。MySQL 5.7 仍默认使用它,只是历史包袱;8.0 改变默认,是技术债清算。
caching_sha2_password 的真实防护机制
它不是简单把 SHA-1 换成 SHA-256,而是一整套加固设计:
- 每个用户生成独立的 20 字节随机
salt,写入authentication_string字段前缀 - 密码哈希 =
SHA256(salt + password),再迭代 5000 轮SHA256,大幅拖慢暴力尝试速度 - 连接时服务器发
salt,客户端本地算哈希后发送——密码本身、原始哈希、salt 全都不在网络上传输 - 非 SSL 连接下,服务器还会通过 RSA 公钥加密传输敏感中间值(如
public_key_retrieval开启时)
注意:caching_sha2_password 名字里的 “caching” 是指服务端缓存已验证成功的会话凭据,避免重复解密开销,并非跳过安全校验。
当用户希望自动格式化、排版或美化 Word(`.docx`)文档时,应使用此技能。触发语包括: - “帮我排版这个Word” - “自动格式化文档” - “统一字体行距” - “论文/报告排版” - “Word排版” - “整理文档格式” - “format this Word file” - “auto typeset” - “standardize document style” 该技能提供一个 Python 脚本(`word_formatter.py`),可
兼容性报错(如 2059)本质是协议升级阵痛
错误信息 authentication plugin 'caching_sha2_password' cannot be loaded 或 Public Key Retrieval is not allowed,说明客户端驱动版本太老,没实现新握手流程。常见于:
- Navicat ≤ 12.0.25(需升至 12.1+)
- JDBC 驱动
mysql-connector-java - PHP
mysqli扩展未启用MYSQLI_CLIENT_SSL且服务端未配 RSA 密钥
别急着回退到 mysql_native_password。先确认客户端是否可升级;若必须降级,也建议仅对内网低敏账号操作,并确保连接走 SSL。
真正容易被忽略的配置细节
即使你改用了 caching_sha2_password,以下两点常被跳过,直接削弱安全性:
-
require_secure_transport = ON未在my.cnf中启用 → 非 SSL 连接仍可建立,RSA 加密环节被绕过 - 未运行
ALTER USER ... REQUIRE SSL给具体账号加强制 SSL 约束 → 单靠全局配置不够细粒度
SHA-256 再强,也防不住明文走网络。算法升级只是起点,传输通道加固才是闭环。










