authentication_string长度过短表明原始密码极弱;mysql 5.7+默认插件下强密码哈希固定为41位,若明显小于41位(如空或'1'等),可判定明文密码强度不足。

直接查 authentication_string 长度是否过短
MySQL 不存明文密码,但 authentication_string 字段长度能反映加密前原始密码的“信息熵”——太短的哈希值往往对应极短的明文(比如 ''、'1'、'123')。5.7+ 默认用 mysql_native_password 插件时,合法强密码哈希固定为 41 位(如 *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9);若长度远小于此,基本可判定原始密码极弱。
SELECT host, user, plugin, authentication_string FROM mysql.user WHERE LENGTH(authentication_string)- 注意排除
''(空密码)和'*'(旧版未设密码占位符),这两类单独处理更稳妥 - 该条件在 8.0 +
caching_sha2_password下不适用——其哈希是 72 位 Base64 字符串,需改用插件匹配+预计算哈希比对
用 LIKE 快速筛常见弱口令模式
明文密码虽不可见,但部分弱口令(如 '123456'、'password')经固定算法哈希后结果唯一。只要知道目标实例用的是哪个认证插件,就能提前算出对应哈希值,再做精确匹配。
- 确认插件:
SELECT user, plugin FROM mysql.user;,重点关注mysql_native_password或caching_sha2_password - 只查
mysql_native_password用户:SELECT host, user FROM mysql.user WHERE plugin = 'mysql_native_password' AND authentication_string IN ('*6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9', '*2470C0C06DEE42FD1618BB99005ADCA2EC9D1E19'); - 别混用哈希值:caching_sha2_password 的
'123456'哈希是SHA256('123456')再 Base64 编码,和上面完全不一样
检查密码策略字段暴露的弱口令线索
MySQL 5.7+ 引入了密码生命周期控制字段,它们本身不存密码,但组合使用能间接暴露风险。例如 password_expired = 'Y' 且 password_last_changed 是 2010 年,大概率说明用户长期没改过密码,甚至可能沿用初始弱口令。
- 查长期未更新且已过期的账号:
SELECT host, user, password_expired, password_last_changed FROM mysql.user WHERE password_expired = 'Y' AND password_last_changed - 查从未设置过密码策略的账号:
SELECT host, user FROM mysql.user WHERE password_reuse_history IS NULL AND password_require_current IS NULL;—— 这类账号往往缺乏强制复杂度要求 - 这些字段在 5.7 以下版本不存在,执行前先
SHOW COLUMNS FROM mysql.user LIKE 'password_%';确认可用性
为什么不能只依赖 LENGTH(TRIM(password)) = 0?
因为 password 字段在 MySQL 5.7 已被移除,8.0 完全不可见。硬写这个条件会报错 Unknown column 'password' in 'where clause',而且即使在老版本中,它也只覆盖空密码,漏掉所有非空但极弱的密码(如 '123'、'root')。
- 必须用
authentication_string替代,它是 5.7+ 唯一可信的身份凭证字段 -
TRIM()只对空密码有效,对弱口令无意义——TRIM('*6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9')还是原样 - 生产环境执行前务必确认账号权限:需
SELECT ON mysql.*,普通业务账号通常不具备
password_last_changed 这类字段在低版本里根本不存在——不先验证环境就跑通用 SQL,要么查不到数据,要么直接报错。











