当前位置: 代码网 > it编程>数据库>Mysql > Window中MySQL绕过密码登录的底层原理详解

Window中MySQL绕过密码登录的底层原理详解

2025年02月15日 Mysql 我要评论
1. 基本知识在 mysql 中,root 用户的密码存储和认证机制随着版本的升级发生了变化绕过密码登录主要依赖于 --skip-grant-tables 选项,但这一过程涉及 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 时,服务器会:

  1. 检查 mysql.user 表,确认用户名、主机匹配的账号是否存在
  2. 调用身份验证插件,使用 authentication_string 进行密码验证
  3. 检查权限系统,确定用户的访问权限

二、 --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 版本不同,认证机制发生变化,导致密码修改失败

解决方案:

  1. 确保 flush privileges; 执行成功。
  2. 直接使用 alter user 而不是 update mysql.user。
  3. 重启 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绕过密码登录内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

  • MySQL分区表语法解读

    MySQL分区表语法解读

    mysql分区表语法1.创建分区表分区键需要和主键设置为复合主键,分区表不可直接转换成非分区表,需要重新建非分区表并导入数据按年份create table pa... [阅读全文]
  • MySQL分库分表动态扩容缩容方式

    MySQL分库分表动态扩容缩容方式

    mysql分库分表动态扩容缩容1.问题分析如何设计可以动态扩容缩容的分库分表方案?对于分库分表来说,主要是面对以下问题:选择一个数据库中间件,调研、学习、测试;... [阅读全文]
  • MySQL分库分表id主键处理方式

    MySQL分库分表id主键处理方式

    mysql分库分表id主键处理1 问题分析分库分表之后,id 主键如何处理?其实这是分库分表之后你必然要面对的一个问题,就是 id 咋生成?因为要是分成多个表之... [阅读全文]
  • MySql如何解决mysql没有root用户问题

    MySql如何解决mysql没有root用户问题

    mysql解决mysql没有root用户发现mysql一开始没有root用户先说这个问题产生的影响,这个跟解题有关,有必要说明,我的user表没有任何一个用户,... [阅读全文]
  • Mysql数据库开启远程连接流程

    本地mysql数据库开启远程访问1、开启远程访问端口(3306端口)依次点击控制面板—系统和安全—windows防火墙—高级设置-入站规则;设置…

    2025年02月18日 数据库
  • Mysql使用Sharding-JDBC配置教程

    1 需求说明使用sharding-jdbc完成对订单表的水平分表,通过快速入门程序的开发,快速体验sharding-jdbc的使用方法。人工创建两张表,t_order_1和t_or…

    2025年02月18日 数据库

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com