当前位置: 首页 > article >正文

FinalShell工具数据备份升级、密码解密方法

前言

FinalShell 作为国产的服务器管理工具和远程终端软件。一个一体化的运维工具,在国内运维人员中还是比较受欢迎。它整合了多个常用功能,界面友好,使用方便。不过它是一个闭源的商业软件,虽然提供免费版本,但部分高级功能需要付费使用。

对于需要管理远程服务器的用户来说,它是一个不错的选择,但如果对软件的开源性和安全性有较高要求,可能需要考虑其他替代方案,比如PuTTY、XShell等。

之前一直在使用4.3.1版本,最近打开老是提示升级,于是换到了4.5.12版本,记录一下数据迁移方法。

这个工具其他版本的备份方法其实也是一样的。

数据迁移

不同版本之间数据迁移其实只需要将下面这几个文件夹的内容复制过去就可以了:

如果不想付费使用同步,其实也可以通过网盘同步进行自动备份FinalShell的整个安装目录,比如onedrive,百度网盘自动同步等。

/conn             # 服务器连接信息配置文件夹
config.json       # 基本配置文件
knownhosts.json   # 服务器密钥
tcconfig.json     # 一些缓存

密码解密

经常在软件中使用,有的时候很容易忘记密码,FinalShell对密码是加密存储的,如果忘记密码的话就会很麻烦,不过好在已经有人写了代码,可以直接将文件中的密钥拿过来直接解密。

可以在\backup\connect_config_XXXX文件中,找到加密后的服务器密钥,然后将下面代码中的PgpoZmsfN3j3rMA10bxQU4ehh9/EqGJB替换为自己的密钥,然后运行代码解密就出来了

另外,为了方便也可以直接打开下面的网址,在线运行代码。

https://c.runoob.com/compile/10/

import java.io.ByteArrayOutputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.math.BigInteger;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.util.Base64;
import java.util.Random;
import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESKeySpec;

/**
 * FinalShell密码解密工具类
 * 用于解密FinalShell存储的加密密码
 */
public class FinalShellDecodePass {
    
    /**
     * 主方法,用于测试密码解密
     * @param args 命令行参数
     * @throws Exception 可能抛出的异常
     */
    public static void main(String[] args) throws Exception {
        // 测试解密一个加密后的密码
        System.out.println(decodePass("PgpoZmsfN3j3rMA10bxQU4ehh9/EqGJB"));
    }

    /**
     * DES解密方法
     * @param data 待解密的数据
     * @param head 密钥数据
     * @return 解密后的字节数组
     * @throws Exception 解密过程中可能抛出的异常
     */
    public static byte[] desDecode(byte[] data, byte[] head) throws Exception {
        // 创建安全随机数生成器
        SecureRandom sr = new SecureRandom();
        // 创建DES密钥规范
        DESKeySpec dks = new DESKeySpec(head);
        // 获取DES密钥工厂实例
        SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
        // 生成密钥
        SecretKey securekey = keyFactory.generateSecret(dks);
        // 获取DES加密器实例
        Cipher cipher = Cipher.getInstance("DES");
        // 初始化加密器为解密模式(模式2)
        cipher.init(2, securekey, sr);
        // 执行解密操作
        return cipher.doFinal(data);
    }

    /**
     * 解密密码的主要方法
     * @param data Base64编码的加密数据
     * @return 解密后的明文密码
     * @throws Exception 解密过程中可能抛出的异常
     */
    public static String decodePass(String data) throws Exception {
        if (data == null) {
            return null;
        } else {
            String rs = "";
            // 将Base64编码的数据解码为字节数组
            byte[] buf = Base64.getDecoder().decode(data);
            // 提取前8字节作为头部数据
            byte[] head = new byte[8];
            System.arraycopy(buf, 0, head, 0, head.length);
            // 提取剩余部分作为加密数据
            byte[] d = new byte[buf.length - head.length];
            System.arraycopy(buf, head.length, d, 0, d.length);
            // 使用头部数据生成密钥并解密
            byte[] bt = desDecode(d, ranDomKey(head));
            // 将解密后的字节数组转换为字符串
            rs = new String(bt);
            return rs;
        }
    }

    /**
     * 根据头部数据生成随机密钥
     * @param head 头部数据(8字节)
     * @return 生成的MD5密钥
     */
    static byte[] ranDomKey(byte[] head) {
        // 使用特定算法生成随机数种子
        long ks = 3680984568597093857L / (long)(new Random((long)head[5])).nextInt(127);
        Random random = new Random(ks);
        int t = head[0];
        // 进行t次随机数生成
        for(int i = 0; i < t; ++i) {
            random.nextLong();
        }
        long n = random.nextLong();
        Random r2 = new Random(n);
        // 构造包含头部数据和随机数的长整型数组
        long[] ld = new long[]{(long)head[4], r2.nextLong(), (long)head[7], (long)head[3], 
                              r2.nextLong(), (long)head[1], random.nextLong(), (long)head[2]};
        
        // 将长整型数组写入字节流
        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        DataOutputStream dos = new DataOutputStream(bos);
        long[] var15 = ld;
        int var14 = ld.length;
        for(int var13 = 0; var13 < var14; ++var13) {
            long l = var15[var13];
            try {
                dos.writeLong(l);
            } catch (IOException var18) {
                var18.printStackTrace();
            }
        }
        try {
            dos.close();
        } catch (IOException var17) {
            var17.printStackTrace();
        }
        // 获取字节数组并计算其MD5值作为最终密钥
        byte[] keyData = bos.toByteArray();
        keyData = md5(keyData);
        return keyData;
    }

    /**
     * 计算MD5值的方法
     * @param data 输入数据
     * @return MD5哈希值的字节数组
     */
    public static byte[] md5(byte[] data) {
        String ret = null;
        byte[] res = null;
        try {
            // 获取MD5算法实例
            MessageDigest m;
            m = MessageDigest.getInstance("MD5");
            // 更新数据
            m.update(data, 0, data.length);
            // 计算MD5值
            res = m.digest();
            // 将结果转换为16进制字符串(未使用)
            ret = new BigInteger(1, res).toString(16);
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        }
        return res;
    }
}

参考

finalshell 免费同步方案

finalshell导出密码解密解密

备份finalshell里的SSH连接记录方法-科技-电脑博士

推荐下载地址:

官网地址(最新版下载地址):https://www.hostbuf.com/t/988.html

FinalShell v4.5.12 远程连接SSH客户端解锁高级专业版

FinalShell专业版(ssh工具)v4.5.12中文破解版 - 423Down

FinalShell官方版下载丨最新版下载丨绿色版下载丨APP下载-123云盘


http://www.kler.cn/a/417204.html

相关文章:

  • oracle: 事务,视图
  • 【iOS自动化】Xcode配置WebDriverAgent
  • Kubernetes是什么?为什么它是云原生的基石
  • 在 MySQL 8 中配置主从同步(主从复制)是一个常见的需求,用于实现数据的冗余备份、读写分离等。
  • Kafka 可靠性探究—副本刨析
  • 在线教程丨YOLO系列10年更新11个版本,最新模型在目标检测多项任务中达SOTA
  • dhcp服务
  • MFC音视频播放器-支持电子放大等功能
  • Monitor 显示器软件开发设计入门二
  • 基于Java Springboot门诊预约之鼻护灵微信小程序
  • 【NLP高频面题 - LLM架构篇】旋转位置编码RoPE相对正弦位置编码有哪些优势?
  • OpenMP出现Stack Overflow及其疑问
  • 前端如何获取unpkg的资源链接
  • 《Vue 服务器端渲染(SSR):优化性能与 SEO》
  • 蓝桥杯模拟题不知名题目
  • MySQL - 性能优化
  • docker迁移gitlab的时候 遇到的一些问题
  • 【聊天室后端服务器开发】语音转换子服务
  • 物联网射频识别和RFID开发(二):RFID原理及硬件组成
  • SVM支持向量机分类——基于Python实现
  • 通信与网络基础
  • Python3交叉编译arm-linux放入设备中运行方式
  • kafka admin client 如何计算kafka发送速度
  • 在 Android 开发中,如何限制某个电话号码不能打电话或接听电话?
  • 【2024寒假实习面经】——CPP方向{篇Ⅰ}
  • MYSQL字段变更