MySQL 8.0默认使用caching_sha2_password而非mysql_native_password,因其强制盐值、5000轮SHA256迭代及RSA加密传输,彻底解决后者无盐哈希、明文协商和易被重放等真实安全漏洞。
caching_sha2_password 不是“推荐用”,而是 MySQL 8.0 的默认认证插件——它取代 mysql_native_password 是因为后者在安全上已不可接受。
mysql_native_password 存储密码的方式是 SHA1(SHA1(password)),没有盐值:
mysql.user 表就能发现哪些账号共用密码 而 caching_sha2_password 强制引入三个硬性防护:
salt,写入 authentication_string 字段前缀 SHA256(salt + password),再迭代 5000 轮 SHA256 allowPublicKeyRetrieval=true)名字里的 “caching” 指服务端内存缓存已成功认证的凭据对,仅用于短时间内的重复连接复用:
sha256_password(都要做 5000 轮 SHA256) 报错 Public Key Retrieval is not allowed 或 Unknown system variable 'caching_sha2_password',通常是因为:
libmysqlclient,无法处理公钥协商 mysqli 和 PDO_MySQL 扩展至今(2026 年)仍未原生支持该插件 真正容易被忽略的点是:这个插件和 SQL 注入完全无关。它只管“你是不是合法用户”,不管“你执行的 SQL 是否危险”。哪怕你用 caching_sha2_password 登录成功,拼接字符串的查询照样被注入。