如何加密一个.jar文件

5

我在一个项目中工作,我们需要加密.jar文件,以便没有人可以访问其中的.class文件...是否有任何Java编码可以帮助我加密.jar文件?

9个回答

17

即使您对JAR文件进行加密,它在JVM运行之前也必须被解密,因此您需要另一个包含解密和在JVM中加载类的JAR文件。

由于无法加密第二个JAR文件本身,恶意用户想要查看您的类文件只需查看第二个JAR文件中的类,然后解密您的超级秘密JAR文件并获得访问权。

也许您可以使用混淆器增强代码的安全性,但它最终只会保护(使反编译更困难而不是不可能)您的类文件免受反编译,而不能防止其被使用。

如果混淆不够用,可以考虑将JAR文件编译为Windows DLL或Unix/Linux SO,这将使其更难以反编译,但并不总是能够正确实现且通常很麻烦。 GCJ 能够某种程度上做到这一点,还有其他商业产品可以直接将 .class/.jar 编译为机器码。

但是,请注意无论您花费多少安全性来加强它,因为客户端计算机必须能够执行它,必须能够读取它,所以无论如何您的代码都将暴露,您只能使其更难。

如果您确实有一个非常秘密的算法,您不想透露它,可以考虑将其转换为 Web 服务,并将其托管在您的服务器上,这样您就不必将实际代码发送到客户端计算机,并且还可以通过检查对其的访问来更好地防止未经授权的应用程序副本。


实际上,我想保护.jar文件内的.class文件不被访问,你有什么办法可以做到这一点吗? - S Gaber
1
AlexR的建议是使用自定义类加载器来按需解密JAR文件,这是可行的,并且与您所要求的更或多或少相同,但请记住,任何安装了JAD的平均技能程序员都可以反向工程化您的自定义类加载器并访问类。我添加了另一种解决方案的段落,但它相当不寻常。 - Simone Gianni

3
我假设你已经意识到一个有经验的Java程序员可以反编译你使用(或编写)的Java工具并解码应用程序的JAR文件。即使使用混淆和字节码修改以及自定义类加载器,Java仍然是可被黑客攻击/反编译的,并且源代码几乎总是可以恢复成某种可读状态。

3
你希望混淆而不是加密jar文件。
在Java中,ProGuard 是一个流行的选择。

1

不行。由于您的程序需要能够运行该代码,因此无论如何都是没有意义的。

但是,您可以混淆代码,使得反编译.class文件会产生更少可读的代码(例如无意义的变量/类名等)。


1
据我所知,标准JVM不支持此功能。但您可以采取以下措施:将应用程序分为两部分。第一部分不加密。它将是一个简单的加载器,将使用自定义类加载器实例化其余部分。该类加载器将获取字节数组形式的类,对其进行解密和加载。

虽然有些人会采用这种方法,但总有可能反编译自定义类加载器并破坏安全性。就像你可以读取解密的代码一样,你也可以将其作为解密后的代码写出来。 :) - carlspring

0

如果您不想提供jar文件内部的类文件访问权限,为什么要将jar文件提供给应用程序呢?这个问题在概念上似乎有些错误...

如果您需要一些自定义的类加载方式,请考虑使用自定义类加载器。


我应该使用哪个应用程序来提供我的.jar文件,以便在.jar文件内保存从Access中获取的.class文件? - S Gaber

0
如果你正在打包成jar文件 -> 只需将其重命名为jarname.ABCD或任何误导性扩展名,甚至可以去掉扩展名,并相应地在应用程序中指定jar名称。

1
file(1) 是一件美妙的事情。 - Davis Herring

-1

我更喜欢jCrypt!这是一个简单的工具,可以加密类(和资源)。


-1
你可以试试https://bce.gopiqiu.com/ 这是描述:BCE是一个Java的jar/war/class加密工具,它可以避免你的代码被反编译;支持的格式有:jar、springbootjar、war;支持在类加载之前对Spring和Tomcat的class文件进行扫描;支持嵌入式jar加密,并防止任何程序转储解密的类。

你的回答可以通过提供更多支持性信息来改进。请编辑以添加进一步的细节,例如引用或文档,以便他人能够确认你的回答是否正确。你可以在帮助中心找到关于如何撰写好回答的更多信息。 - Community

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接