mysql中空密码账户可通过查询authentication_string = ''识别,弱密码需比对预计算哈希值,flush privileges不解决密码问题,修复应使用alter user而非手动更新表。

如何识别 MySQL 中空密码账户
MySQL 5.7+ 默认禁止空密码登录(尤其在 skip-grant-tables 关闭时),但旧版本或手动绕过初始化流程后仍可能存在。空密码本质是 authentication_string 字段为空字符串或 '',而非 NULL。
执行以下查询直接定位:
SELECT host, user, authentication_string FROM mysql.user WHERE authentication_string = '' OR TRIM(authentication_string) = '';
注意:mysql.user 表中 plugin 字段为 mysql_native_password 或 caching_sha2_password 时,空字符串才真正代表无认证;若 plugin 是 auth_socket 或 unix_socket,则密码字段本就无效,不构成空密码风险,无需处理。
如何检测常见弱密码(如 '123456'、'root'、用户名本身)
MySQL 不存储明文密码,无法直接比对密码强度,但可通过插件或外部工具辅助判断。更务实的做法是:检查是否使用了可预测的哈希值——例如已知弱口令对应的 mysql_native_password 哈希(SHA1(SHA1(password)))。
推荐用如下 SQL 快速筛查高危模式:
SELECT host, user, plugin, authentication_string FROM mysql.user
WHERE
-- 明确等于常见弱口令哈希(以 '123456' 为例)
authentication_string IN (
'*6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9',
'*81F5E21E35407D884A6CD4A731AEBFB6AF209E1B', -- 'root'
'*A1C1032429532143709E4E17341419569210510C' -- 'password'
)
-- 或密码哈希与用户名完全相同(极低熵)
OR authentication_string = CONCAT('*', UPPER(SHA1(UNHEX(SHA1(user)))));
说明:
-
authentication_string存储的是加盐哈希(caching_sha2_password)或双重 SHA1(mysql_native_password),上述哈希值需按实际版本预生成并核对 - 避免用
LIKE '%123%'类模糊匹配——哈希是定长且无规律的,无效 - 该方法仅覆盖最泛滥的几个弱口令,不能替代密码策略强制
为什么 FLUSH PRIVILEGES 不解决密码问题
很多人执行完 UPDATE mysql.user 后习惯性运行 FLUSH PRIVILEGES,但这在修改密码类操作中是多余甚至误导的。
原因:
- MySQL 5.7.6+ 中,
SET PASSWORD、ALTER USER等语句会自动重载权限表,无需手动刷新 -
FLUSH PRIVILEGES只在你**直接修改系统表且未用授权语句**时才需要(例如UPDATE mysql.user后),但它不校验密码格式,也不触发密码强度检查 - 若误用
FLUSH PRIVILEGES后发现登录失败,大概率是改表时写错了authentication_string格式(比如少了开头的*或长度不对)
修复弱密码时 plugin 和 authentication_string 的对应关系
不同认证插件要求 authentication_string 格式严格不同,填错会导致账户锁死。不要手动拼接哈希值,优先用 ALTER USER 语句:
-- 安全方式:让 MySQL 自动计算并适配 plugin
ALTER USER 'test'@'localhost' IDENTIFIED WITH mysql_native_password BY 'NewPass#2024';
<p>-- 危险方式:手动 UPDATE(极易出错)
UPDATE mysql.user SET
plugin='mysql_native_password',
authentication_string=PASSWORD('NewPass#2024') -- 已弃用,且结果不可控
WHERE user='test' AND host='localhost';</p>
关键点:
-
PASSWORD()函数在 8.0 中已被移除,5.7 中也标记为 deprecated,绝对不要用 -
ALTER USER ... BY 'xxx'会根据当前default_authentication_plugin和用户原有plugin自动选择哈希算法 - 若必须兼容老客户端,显式指定
IDENTIFIED WITH mysql_native_password,否则 8.0 默认用caching_sha2_password,部分 JDBC/ODBC 驱动需升级才能连
真正容易被忽略的是:改完密码后,要立刻用新凭据测试连接,而不是只查 mysql.user 表确认字段变了——因为 plugin 不匹配或哈希格式错误时,表里看着正常,实际无法登录。











