快速找回MySQL密码的2种方法

该文章已生成可运行项目,

MySQL忘记密码的解决方案

问题背景
MySQL密码遗忘或丢失是常见问题,尤其在多环境管理时。需要在不影响数据的前提下重置或导出密码。

适用场景

  • 无法通过常规方式登录MySQL
  • 需从现有连接工具(如Navicat)中恢复密码
  • 服务器权限受限时的应急处理

方法一:通过MySQL安全模式重置密码

原理
通过跳过权限表启动MySQL服务,直接修改用户密码。

操作流程

  1. 停止MySQL服务

    sudo systemctl stop mysql
    
  2. 启动无权限验证的MySQL

    mysqld_safe --skip-grant-tables &
    
  3. 修改root密码

    UPDATE mysql.user SET authentication_string=PASSWORD('new_password') WHERE User='root';
    FLUSH PRIVILEGES;
    

注意事项

  • 需具有服务器管理员权限
  • 执行后需重启MySQL正常服务

方法二:通过Navicat导出已保存的密码(尽量在自己本地进行导出防止密码泄露)

前提条件

  • Navicat已保存过该MySQL连接
  • 本地未加密存储连接配置

操作步骤

  1. 通过Navicat导出数据库链接

  2. 选中需要导出的数据库并勾选导出密码

  3. 执行程序进行解密

    import cn.hutool.core.io.file.FileReader;
    import cn.hutool.crypto.symmetric.AES;
    import org.dom4j.Document;
    import org.dom4j.DocumentException;
    import org.dom4j.DocumentHelper;
    import org.dom4j.Element;
    
    import java.util.Iterator;
    
    public class NavicatDecrypt {
    
    
        public static void main(String[] args) throws DocumentException {
            // 整体参考:http://t.zoukankan.com/lori-p-15686959.html
            // 指定导出文件
            FileReader fileReader = new FileReader("Navicat导出的文件路径");
            String result = fileReader.readString();
            System.out.println("==================获取文件内容==================");
            System.out.println(result);
            Document document = DocumentHelper.parseText(result);
            Element root = document.getRootElement();
            Iterator<Element> connectionList = root.elementIterator("Connection");
            connectionList.forEachRemaining(v -> {
                Element connection = v;
                System.out.println("==================获取导出参数==================");
                String connectionName = connection.attributeValue("ConnectionName");
                String connType = connection.attributeValue("ConnType");
                String host = connection.attributeValue("Host");
                String port = connection.attributeValue("Port");
                String userName = connection.attributeValue("UserName");
                String encryptPassword = connection.attributeValue("Password");
                String database = connection.attributeValue("Database");
                System.out.println("1.------->连接名称:" + connectionName);
                System.out.println("2.------->数据库类型:" + connType);
                System.out.println("3.------->主机(IP):" + host);
                System.out.println("4.------->端口:" + port);
                System.out.println("5.------->用户名:" + userName);
                // 解密 //参考https://the-x.cn/cryptography/Aes.aspx
                AES aes = new AES("CBC", "PKCS7Padding", "libcckeylibcckey".getBytes(), "libcciv libcciv ".getBytes());
                String val = aes.decryptStr(encryptPassword);
                System.out.println("6.------->密码:" + val);
                System.out.println("7.------->数据库名称:" + database);
                System.out.println("==============================================");
                System.out.println();
                System.out.println();
                System.out.println();
                System.out.println("================以下为全部连接信息================");
            });
        }
    }
  4.  所需依赖
        <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
            <version>5.8.3</version>
        </dependency>
        <dependency>
            <groupId>org.bouncycastle</groupId>
            <artifactId>bcprov-jdk15to18</artifactId>
            <version>1.68</version>
        </dependency>
        <dependency>
            <groupId>org.dom4j</groupId>
            <artifactId>dom4j</artifactId>
            <version>2.1.3</version>
        </dependency>

风险提示

  • 可能违反数据库安全策略
  • 仅限合法授权场景使用

技术边界说明

  • 所有操作需遵守数据安全法规
  • 企业环境需获得正式授权
  • 解密工具仅限合法恢复用途

扩展阅读方向

  1. MySQL 8.0密码策略强化机制
  2. 基于Vault的数据库密码动态管理
  3. Navicat连接配置加密原理分析
  4. 数据库账号最小权限分配原则
本文章已经生成可运行项目
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值