Navicat中保存的数据库密码找回 Java 8

news2025/5/11 6:50:55
  • 导出数据库连接
  • 打开导出的connections.ncx文件
  • 找到加密的password
  • 放入java程序中解密即可

package com.asia.card.cloud.enterprise.api;

import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
import java.util.Arrays;

public class NavicatPassword {

	private static final String AES_KEY = "libcckeylibcckey";
	private static final String AES_IV = "libcciv libcciv ";
	private static final String BLOW_KEY = "3DC5CA39";
	private static final String BLOW_IV = "d9c7c3c8870d64bd";

	public static void main(String[] args) throws Exception {
		String encrypted = "导出文件中的加密密码";
		int version = 12;

		String decrypted = NavicatPassword.decrypt(encrypted, version);
		System.out.println("解密结果: " + decrypted);
	}

	public static String decrypt(String ciphertext, int version) throws Exception {
		switch (version) {
			case 11:
				return decryptBlowfish(ciphertext);
			case 12:
				return decryptAES(ciphertext);
			default:
				throw new IllegalArgumentException("Unsupported version: " + version);
		}
	}

	public static String encrypt(String plaintext, int version) throws Exception {
		switch (version) {
			case 11:
				return encryptBlowfish(plaintext);
			case 12:
				return encryptAES(plaintext);
			default:
				throw new IllegalArgumentException("Unsupported version: " + version);
		}
	}

	// ========== Version 11: Blowfish ==========
	private static String decryptBlowfish(String ciphertext) throws Exception {
		byte[] iv = hexToBytes(BLOW_IV);
		byte[] key = sha1(BLOW_KEY);
		byte[] encrypted = hexToBytes(ciphertext.toLowerCase());

		Cipher cipher = Cipher.getInstance("Blowfish/ECB/NoPadding");
		cipher.init(Cipher.DECRYPT_MODE, new SecretKeySpec(key, "Blowfish"));

		byte[] currentVector = iv.clone();
		StringBuilder result = new StringBuilder();

		int blocks = encrypted.length / 8;
		int remain = encrypted.length % 8;

		for (int i = 0; i < blocks; i++) {
			byte[] block = Arrays.copyOfRange(encrypted, i * 8, (i + 1) * 8);
			byte[] decrypted = cipher.doFinal(block);
			byte[] plain = xor(decrypted, currentVector);
			currentVector = xor(currentVector, block);
			result.append(new String(plain, StandardCharsets.UTF_8));
		}

		if (remain > 0) {
			currentVector = cipher.doFinal(currentVector);
			byte[] remainBytes = Arrays.copyOfRange(encrypted, blocks * 8, encrypted.length);
			result.append(new String(xor(remainBytes, currentVector), StandardCharsets.UTF_8));
		}

		return result.toString().trim();
	}

	private static String encryptBlowfish(String plaintext) throws Exception {
		byte[] iv = hexToBytes(BLOW_IV);
		byte[] key = sha1(BLOW_KEY);

		byte[] inputBytes = plaintext.getBytes(StandardCharsets.UTF_8);
		int padLen = 8 - (inputBytes.length % 8);
		byte[] padded = Arrays.copyOf(inputBytes, inputBytes.length + padLen); // 零填充

		Cipher cipher = Cipher.getInstance("Blowfish/ECB/NoPadding");
		cipher.init(Cipher.ENCRYPT_MODE, new SecretKeySpec(key, "Blowfish"));

		byte[] currentVector = iv.clone();
		StringBuilder result = new StringBuilder();

		for (int i = 0; i < padded.length; i += 8) {
			byte[] block = xor(Arrays.copyOfRange(padded, i, i + 8), currentVector);
			byte[] encrypted = cipher.doFinal(block);
			currentVector = xor(currentVector, encrypted);
			result.append(bytesToHex(encrypted));
		}

		return result.toString().toUpperCase();
	}

	// ========== Version 12: AES ==========
	private static String decryptAES(String ciphertext) throws Exception {
		byte[] key = AES_KEY.getBytes(StandardCharsets.UTF_8);
		byte[] iv = AES_IV.getBytes(StandardCharsets.UTF_8);
		byte[] encrypted = hexToBytes(ciphertext.toLowerCase());

		Cipher cipher = Cipher.getInstance("AES/CBC/NoPadding");
		cipher.init(Cipher.DECRYPT_MODE, new SecretKeySpec(key, "AES"), new IvParameterSpec(iv));

		byte[] result = cipher.doFinal(encrypted);
		return new String(result, StandardCharsets.UTF_8).trim();
	}

	private static String encryptAES(String plaintext) throws Exception {
		byte[] key = AES_KEY.getBytes(StandardCharsets.UTF_8);
		byte[] iv = AES_IV.getBytes(StandardCharsets.UTF_8);

		byte[] inputBytes = plaintext.getBytes(StandardCharsets.UTF_8);
		int padLen = 16 - (inputBytes.length % 16);
		byte[] padded = Arrays.copyOf(inputBytes, inputBytes.length + padLen); // 零填充

		Cipher cipher = Cipher.getInstance("AES/CBC/NoPadding");
		cipher.init(Cipher.ENCRYPT_MODE, new SecretKeySpec(key, "AES"), new IvParameterSpec(iv));

		byte[] result = cipher.doFinal(padded);
		return bytesToHex(result).toUpperCase();
	}

	// ========== 工具方法 ==========
	private static byte[] xor(byte[] a, byte[] b) {
		byte[] result = new byte[a.length];
		for (int i = 0; i < a.length; i++) {
			result[i] = (byte) (a[i] ^ b[i]);
		}
		return result;
	}

	private static byte[] sha1(String input) throws Exception {
		return MessageDigest.getInstance("SHA-1").digest(input.getBytes(StandardCharsets.UTF_8));
	}

	private static byte[] hexToBytes(String hex) {
		int len = hex.length();
		byte[] out = new byte[len / 2];
		for (int i = 0; i < len; i += 2) {
			out[i / 2] = (byte) ((Character.digit(hex.charAt(i), 16) << 4)
					+ Character.digit(hex.charAt(i + 1), 16));
		}
		return out;
	}

	private static String bytesToHex(byte[] bytes) {
		StringBuilder hex = new StringBuilder();
		for (byte b : bytes) {
			hex.append(String.format("%02X", b));
		}
		return hex.toString();
	}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2372935.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

vs code管理员权限启动问题

vs code非管理员启动可以正常启动用管理员启动vs code&#xff0c;会提示 解决办法 找到argv.json文件在argv.json文件中添加 "disable-chromium-sandbox": true重启vs code即可

Spring Cloud与Service Mesh集成:Istio服务网格实践

文章目录 引言一、Spring Cloud与Service Mesh概述二、Istio服务网格架构三、Spring Cloud与Istio集成的基础设施准备四、服务发现与负载均衡五、流量管理与弹性模式六、安全通信与认证授权七、可观测性集成八、配置管理集成总结 引言 微服务架构已成为现代分布式系统的主流设…

React+Taro选择日期组件封装

话不多说&#xff0c;直接上效果 1.页面渲染时间模块 {this.renderCalendarPopup()}2.引入时间组件弹层&#xff0c;state中加入showPopup(控制什么时候展示时间选择弹层)&#xff0c;time(选择后的时间值) private renderCalendarPopup () > {const { showPopup, time…

C++进阶--AVL树的实现续

文章目录 C进阶--AVL树的实现双旋AVL树的查找AVL树的检验结语 很高兴和搭大家见面&#xff0c;给生活加点impetus&#xff0c;开启今天的比编程之路&#xff01;&#xff01; 今天我们来完善AVL树的操作&#xff0c;为后续红黑树奠定基础&#xff01;&#xff01; 作者&#x…

AutoGen+Deepseek+chainlit的简单使用

AutoGen 的应用场景 AutoGen 作为一个强大的多智能体协作框架&#xff0c;可用于多种复杂任务&#xff1a; 自动化工作流&#xff1a;构建由多个智能体组成的流水线&#xff0c;例如数据收集、分析、报告生成复杂问题分解&#xff1a;将难题拆解为子任务&#xff0c;分配给不…

采用SqlSugarClient创建数据库实例引发的异步调用问题

基于SqlSugar编写的多个WebApi接口&#xff0c;项目初始化时采用单例模式注册SqlSugarClient实例对象&#xff0c;前端页面采用layui布局&#xff0c;并在一个按钮事件中通过Ajax连续调用多个WebApi接口获取数据。实际运行时点击按钮会随机报下面几种错误&#xff1a; Execute…

第7次课 栈A

课堂学习 栈&#xff08;stack&#xff09; 是一种遵循先入后出逻辑的线性数据结构。 我们可以将栈类比为桌面上的一摞盘子&#xff0c;如果想取出底部的盘子&#xff0c;则需要先将上面的盘子依次移走。我们将盘子替换为各种类型的元素&#xff08;如整数、字符、对象等&…

软考-软件设计师中级备考 13、刷题 数据结构

倒计时17天时间不多了&#xff0c;数据库、UML、等知识点有基础直接略过&#xff0c;法律全靠考前的一两天刷题&#xff0c;英语直接放弃。 一、数据结构&#xff1a;链表、栈、队列、数组、哈希表、树、图 1、关于链表操作&#xff0c;说法正确的是&#xff1a; A)新增一个头…

centos的根目录占了大量空间怎么办

问题 当根目录磁盘不够时&#xff0c;就必须删除无用的文件了 上面的&#xff0c;如果删除/usr 或/var是可以释放出系统盘的 定位占空间大的文件 经过命令&#xff0c;一层层查哪些是占磁盘的。 du -sh /* | sort -rh | head -n 10 最终排查&#xff0c;是有个系统日志占了20…

电子电器架构 --- 新能源高压上下电那点事一文通

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 钝感力的“钝”,不是木讷、迟钝,而是直面困境的韧劲和耐力,是面对外界噪音的通透淡然。 生活中有两种人,一种人格外在意别人的眼光;另一种人无论…

每日算法-250510

每日算法学习记录 - 250510 1. LeetCode 2086. 喂食仓鼠的最小食物桶数 题目描述: 解题思路 这是一个典型的贪心问题。我们的目标是用最少的食物桶喂饱所有仓鼠。 解题过程 核心思想是&#xff1a;当遇到一只仓鼠时&#xff0c;如何放置食物桶才能最有效地利用这个桶。 …

渗透测试行业术语1

渗透测试行业术语1 1. 肉鸡 所谓“肉鸡”是一种很形象的比喻&#xff0c;比喻那些可以随意被我们控制的电脑&#xff0c;对方可以是 WINDOWS 系统&#xff0c;也可以是 UNIX/LINUX 系统可以是普通的个人电脑&#xff0c;也可以是大型的服务器我们可以象操作自己的电脑那样来操…

【大模型】使用 LLaMA-Factory 进行大模型微调:从入门到精通

使用 LLaMA-Factory 进行模型微调&#xff1a;从入门到精通 一、环境搭建&#xff1a;奠定微调基础&#xff08;一&#xff09;安装依赖工具&#xff08;二&#xff09;创建 conda 环境&#xff08;三&#xff09;克隆仓库并安装依赖 二、数据准备&#xff1a;微调的基石&#…

使用Python 打造多格式文件预览工具 — 图、PDF、Word、Excel 一站式查看

在日常办公或文件管理场景中&#xff0c;我们经常面临这样的问题&#xff1a;在一个文件夹中短时间内产生了大量不同类型的文件&#xff08;如图片、PDF、Word、Excel&#xff09;&#xff0c;我们需要快速浏览和筛选这些文件的内容&#xff0c;却不希望一个个打开它们。有没有…

[docker基础四]容器虚拟化基础之 LXC

目录 一 认识LXC 二 LXC容器操作实战 1&#xff09;实战目的 2&#xff09;基础知识 lxc-checkconfig lxc-create lxc-start lxc-ls lxc-info lxc-attach lxc-stop lxc-destory 3&#xff09;安装LXC(我的是Ubuntu) 4&#xff09;操作实战 1. 检查 lxc 是否运行…

路由策略和策略路由的区别以及配置案例

区别 路由策略&#xff1a;路由策略是通过ACL等方式控制路由发布&#xff0c;让对方学到适当路由条目&#xff0c;比如有20条路由&#xff0c;只想让某个路由器学到10条&#xff0c;可以通过路由策略进行过滤。 策略路由&#xff1a;策略路由是通过定义策略和应用&#xff0c…

MAD-TD: MODEL-AUGMENTED DATA STABILIZES HIGH UPDATE RATIO RL

ICLR 2025 spotlight paper 构建能够在少量样本下学习出优良策略的深度强化学习&#xff08;RL&#xff09;智能体一直是一个极具挑战性的任务。为了提高样本效率&#xff0c;近期的研究尝试在每获取一个新样本后执行大量的梯度更新。尽管这种高更新-数据比&#xff08;UTD&am…

PyTorch API 10 - benchmark、data、批处理、命名张量

基于 PyTorch 2.7 文章目录 基准测试工具 - torch.utils.benchmarktorch.utils.bottlenecktorch.utils.checkpointtorch.utils.cpp_extensiontorch.utils.data数据集类型映射式数据集可迭代式数据集 数据加载顺序与采样器加载批处理与非批处理数据自动批处理&#xff08;默认情…

后缀表达式+栈(详解)(c++)

前言 很抱歉&#xff0c;上一期没有介绍栈stack的用法&#xff0c;今天简要介绍一下&#xff0c;再讲讲后缀表达式&#xff0c;用stack栈做一些后缀表达式的练习。 栈 栈stack是c中系统给出的栈&#xff0c;有了它&#xff0c;就不用自己创建栈啦&#xff01; 头文件 栈sta…

[C++类和对象]构造函数和析构函数

类的6个默认成员函数 如果一个类中什么成员都没有&#xff0c;简称为空类。 空类中真的什么都没有吗&#xff1f; 并不是&#xff0c;任何类在什么都不写时&#xff0c;编译器会自动生成以下6 个默认成员函数。 默认成员函数&#xff1a;用户没有显式实现&#xff0c;编译器会…