Window中MySQL绕过密码登录的底层原理详解
作者:码农研究僧
1. 基本知识
在 MySQL 中,root 用户的密码存储和认证机制随着版本的升级发生了变化
绕过密码登录主要依赖于 --skip-grant-tables 选项,但这一过程涉及 MySQL 的用户认证体系、权限管理以及数据库安全策略
本文将详细分析 MySQL 绕过密码的底层原理,并解释为什么某些操作在 --skip-grant-tables 模式下无效,以及如何正确生效修改
一、MySQL 用户认证机制
MySQL 的用户认证由以下几个核心组件组成:
mysql.user 表:存储用户信息,如 user、host、authentication_string(MySQL 5.7+)
身份验证插件(Authentication Plugin):MySQL 使用不同的插件来管理用户登录,例如:
mysql_native_password
caching_sha2_password(MySQL 8.0 默认)
sha256_password
权限系统(Privilege System):用于控制用户在数据库中的操作权限
当用户登录 MySQL 时,服务器会:
- 检查 mysql.user 表,确认用户名、主机匹配的账号是否存在
- 调用身份验证插件,使用 authentication_string 进行密码验证
- 检查权限系统,确定用户的访问权限
二、 --skip-grant-tables 绕过权限验证
--skip-grant-tables
选项允许 MySQL 启动时跳过权限系统,这意味着:
MySQL 不会检查用户权限,所有用户都可以直接访问数据库,由于 权限系统未启用,某些 SQL 语句(如 ALTER USER)可能无法执行,仍然需要 手动刷新权限(FLUSH PRIVILEGES;) 才能使修改生效
问题点:如果 FLUSH PRIVILEGES; 未执行,MySQL 仍然会使用旧的用户认证规则,导致密码修改后仍然无法登录
三、password() 函数被移除
在 MySQL 8.0 及以上版本中,password() 函数已被移除,所以UPDATE mysql.user SET password = PASSWORD('root') WHERE user = 'root';
会导致 语法错误
正确方式(适用于 MySQL 5.7 及以上):
UPDATE mysql.user SET authentication_string = '' WHERE user = 'root' AND host = 'localhost'; FLUSH PRIVILEGES; ALTER USER 'root'@'localhost' IDENTIFIED BY 'root';
注意:
authentication_string 取代了 password 字段;ALTER USER 是修改密码的推荐方法
四、以管理员权限运行命令行
在 Windows 上,如果没有以管理员身份运行 cmd,则可能遇到权限问题,导致 ALTER USER 操作失败
五、 --skip-grant-tables 退出后密码失效的原因
如果在 --skip-grant-tables 模式下修改了密码,然后退出 MySQL 后密码仍然无效,可能的原因有:
没有执行 FLUSH PRIVILEGES;,导致修改未生效
MySQL 仍然使用缓存,未完全刷新认证信息
未使用 ALTER USER,仍然在 mysql.user 直接修改 authentication_string,但没有正确同步
MySQL 版本不同,认证机制发生变化,导致密码修改失败
解决方案:
- 确保 FLUSH PRIVILEGES; 执行成功。
- 直接使用 ALTER USER 而不是 UPDATE mysql.user。
- 重启 MySQL 以清除缓存
2. 实战Demo
以实战Demo进行演示
cmd窗口一定要管理员权限
cmd窗口一定要管理员权限
cmd窗口一定要管理员权限
开启跳过密码登录:mysqld --console --skip-grant-tables --shared-memory
(此窗口勿关闭)
后续在另外一个窗口cmd管理员,输入如下:
直接登录,跳过密码:mysql -u root -p
链接数据库:USE mysql;
如果是 MySQL 5.7 及以上(包括 MySQL 8.0),请执行:
UPDATE mysql.user SET authentication_string = '' WHERE user = 'root' AND host = 'localhost'; FLUSH PRIVILEGES;
然后再执行:
ALTER USER 'root'@'localhost' IDENTIFIED BY 'root';
注意:这里 authentication_string 字段在 MySQL 5.7 及以上版本中取代了 password 字段
别忘记刷新权限以及退出:
FLUSH PRIVILEGES; quit;
总体截图如下:
先关闭 MySQL 服务器:net stop mysql
然后重新启动:net start mysql
重新登录 MySQL:mysql -u root -p
到此这篇关于Window中MySQL绕过密码登录的底层原理详解的文章就介绍到这了,更多相关MySQL绕过密码登录内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!