如何保护我的jar资源不被提取?

时间:2011-07-08 10:28:44

标签: java image resources audio executable-jar

我想发布我的* .jar文件。我的意思是我的应用程序是使用但我不希望用户或任何人提取我的资源(声音,图片和其他)。

如何保护它?

THX

4 个答案:

答案 0 :(得分:5)

发明一个DRM机制,一旦他们破解它,就将它们起诉。

不,老实说,你想要实现的目标真的非常复杂 - 如果不是不可能的话。您需要以加密机制的密钥不会包含在jar本身中的方式加密资源(就像在代码中硬编码一样 - 黑客喜欢这个)。

所以你需要你的应用程序打开一些在你控制下需要一直在线的服务器的在线连接 - 而且你的用户会讨厌这样做,因为它会产生所有麻烦(只需按照在线操作)关于最近PC游戏的讨论)......真的值得吗?

答案 1 :(得分:2)

用Java或任何语言都无法做到这一点。如果您的程序可以使用某些内容,则可以使用它。你可以让人们更难一点,但是如果他们想要窃取图形/声音,他们可以在一天结束时使用。

你会更加努力地制作人们喜欢并且用户友好的图形和声音等。

答案 2 :(得分:0)


我们的Flash和Java Antidecompilers使用无密钥加密,即不使用硬编码加密密钥。确保使用任何反编译器就足够了。是的,我理解标准的EULA不允许它,但是我们通过个人请求给予了这样的许可 http://www.bisguard.com/contacts.html
Goog运气

答案 3 :(得分:0)

This网站引入了JAR保护工具和受保护的JAR启动器。该工具可与Java 8一起使用,但不能与例如Java 11。他们的user manual中描述的想法讨论了ClassLoader加密方法。虽然提供的工具只是作为试用版提供,但我设法成功保护并启动了一个简单的JAR

secret.txt

My secret

Main.java

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.lang.invoke.MethodHandles;

import static java.lang.invoke.MethodHandles.lookup;
import static java.nio.charset.StandardCharsets.UTF_8;

public class Main
{
    public static void main(String[] arguments) throws Exception
    {
        final byte[] resourceBytes = getResource("secret.txt");
        System.out.println("Secret: " + new String(resourceBytes, UTF_8).trim());
    }

    @SuppressWarnings("SameParameterValue")
    private static byte[] getResource(String filePath) throws Exception
    {
        MethodHandles.Lookup lookup = lookup();
        Class<?> currentClass = lookup.lookupClass();
        try (InputStream inputStream = currentClass.getResourceAsStream("/" + filePath))
        {
            return toByteArray(inputStream);
        }
    }

    private static byte[] toByteArray(InputStream inputStream) throws IOException
    {
        ByteArrayOutputStream buffer = new ByteArrayOutputStream();

        int nRead;
        byte[] data = new byte[16384];

        while ((nRead = inputStream.read(data, 0, data.length)) != -1)
        {
            buffer.write(data, 0, nRead);
        }

        return buffer.toByteArray();
    }
}

JarProtector

>"C:\Program Files\Java\jdk1.8.0_181\bin\java" -jar JarProtector.jar JarProtectorTest.jar

JarProtectorTrial started...
[1] protecting JarProtectorTest.jar
[1] file protected: JarProtectorTest.car
JarProtectorTrial successfully ended.

JarStarter

>"C:\Program Files\Java\jdk1.8.0_181\bin\java" -cp JarStarter.jar;JarProtectorTest.car com.bfa.JarStarter Main
Secret: My secret