gpt4 book ai didi

java - 加密可执行 jar

转载 作者:行者123 更新时间:2023-11-30 01:58:33 29 4
gpt4 key购买 nike

为了了解基础知识,我使用 Eclipse 进行编码并创建可执行 jar 文件。

一些背景研究:
我知道您可以反编译 jar 文件并查看源代码。事实上,有一些免费程序,例如 JD GUI,可以轻松反编译 jar 文件并显示其所有内容。这是一个问题,特别是如果你想分发 java 程序。
当我了解到这一点时,我立即开始寻找解决方案,但我找不到直接的答案。

问题:
我的问题是,如何加密 jar 文件,或者至少加密 class 文件以使其不可读如果你反编译它?
我一直看到的一个解决方案是你可以混淆你的代码,但问题是你的代码仍然必须能够运行,因此可以用一点点对混淆进行逆向工程努力。我能想到的唯一其他解决方案是拥有两个单独的 jar 文件,以便其中一个 jar 文件被加密并需要另一个 jar 文件来解密它。现在,在您说“他们可以反编译另一个 jar 并使用它来解密第一个 jar”之前。我的想法是使用一个密码来解密第一个 jar 。理论上,用户可以知道确切的解密方法,但如果没有密语(密码),则完全无用。

我的问题:
我将如何实现这个?我问如何运行一个 jar 文件来使用用户指定的密码加密/解密另一个 jar?
请随意提供示例代码,我正在寻找可以获得的任何帮助。

提前致谢!

最佳答案

假设您有一个 JAR 文件,其中某些类在编译后已被加密。

假设您有一个名为 SecureMain 的加密类,您想要解密并执行它:

public class SecureMain implements Runnable {

@Override
public void run() {
System.out.println("Running...");
}

}

给定以下 JAR 文件结构:

org
`---stackoveflow
`---example
|---EncryptedClassLoader.class
|---Main.class
`---SecureMain.enc

其中带有 enc 文件扩展名的文件使用某种 key 进行加密。

可以实现EncryptedClassLoader来在加载类文件之前对其进行解密:

public class EncryptedClassLoader extends ClassLoader {

private final SecretKeySpec key;

public EncryptedClassLoader(SecretKeySpec key) {
this.key = key;
}

protected Class<?> findClass(String name) throws ClassNotFoundException {
try {
String[] segments = name.split("\\.");
String filePath = String.join("/", segments) + ".enc";
byte[] bytes = decryptResource(filePath);
return defineClass(name, bytes, 0, bytes.length);
} catch (Exception e) {
throw new ClassNotFoundException("Unable to load class: " + name, e);
}
}

private byte[] decryptResource(String filePath) throws Exception {
File file = new File(getResource(filePath).getFile());
byte[] bytes = Files.readAllBytes(file.toPath());
Cipher cipher = Cipher.getInstance("AES");
cipher.init(Cipher.DECRYPT_MODE, key);
return cipher.doFinal(bytes);
}

}

然后可以实现Main类来从命令行参数加载 key ,然后加载并执行加密的SecureMain类:

public class Main {

public static void main(String[] args) throws Exception {
byte[] bytes = Base64.getDecoder().decode(args[0]);
SecretKeySpec key = new SecretKeySpec(bytes, "AES");
ClassLoader loader = new EncryptedClassLoader(key);
Class<?> cls = loader.loadClass("com.stackoverflow.example.SecureMain");
Runnable main = (Runnable) cls.newInstance();
main.run();
}

}

最后,应该使用作为参数传递的 key 来执行 JAR。

java -jar myjar.jar <base64 encoded key>

关于java - 加密可执行 jar,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53623548/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com