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

Java 如何保护我的jar资源不被提取?,java,image,resources,audio,executable-jar,Java,Image,Resources,Audio,Executable Jar,我想分发我的*.jar文件。我的意思是要使用我的应用程序,但我不希望用户或任何人提取我的资源(声音、图片和其他) 如何保护它 这在Java或任何语言中都是不可能做到的。如果您的程序可以使用某些内容,则可以将其获取。你可以让人们更难理解,但最终如果他们想窃取图形/声音,他们可以做到 你最好把精力放在制作人们喜欢且用户友好的图形和声音等方面。发明一种机制,一旦他们破解了,就起诉他们至死 不,老实说,你想要实现的是非常非常复杂的——如果不是不可能的话。您需要以加密机制的密钥不包含在jar中的方式对资源

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

如何保护它


这在Java或任何语言中都是不可能做到的。如果您的程序可以使用某些内容,则可以将其获取。你可以让人们更难理解,但最终如果他们想窃取图形/声音,他们可以做到

你最好把精力放在制作人们喜欢且用户友好的图形和声音等方面。

发明一种机制,一旦他们破解了,就起诉他们至死

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

因此,您需要您的应用程序打开一些与您控制的服务器的在线连接,该服务器需要一直在线-您的用户会因为这样做而讨厌您,因为这会产生所有的麻烦(只需关注有关最近PC游戏的在线讨论)。。。真的值得吗


我们的Flash和Java反编译程序使用无密钥加密,即不对加密密钥使用硬编码。以确保使用任何反编译器都足够。是的,我知道标准EULA不允许这样做,但我们会在
Goog luck网站介绍了一个
JAR
保护工具和一个受保护的
JAR
启动器。这些工具适用于
Java8
,但不适用于
Java11
。他们在讨论
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();
    }
}
JarStarter

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

你如何阻止他们拍摄屏幕截图/录制音频/录制屏幕?你不想让任何人访问你的声音和图片,甚至连你自己的程序都不想?库拉里斯:至少我试着保护它@凯瑞克:呵呵。。。很抱歉很抱歉我是说从extraction@Kenjiro这是非常无用的保护,如果我可以通过按PRINT来获取图片,或者使用标准的Windows工具来获取音频,那么这就是“kiasu”。但是如果真的需要,你应该使用浮雕答案。创建在线连接只会让事情变得更难,但我仍然能够将我的一个类放在你的应用程序的引导类路径上,并以这种方式获取资源。@Kaj:是的。是的,我只是想指出,他寻找的是一个完美的数字版权管理方案(实际上不仅仅是他),但我并不打算在这里发明:)对于图像,有截图,对于声音,有重定向/开发/音频等。聪明的人总会找到“窃取”版权的方法。
>"C:\Program Files\Java\jdk1.8.0_181\bin\java" -cp JarStarter.jar;JarProtectorTest.car com.bfa.JarStarter Main
Secret: My secret