在.jar文件中隐藏源代码

9

很容易提取.jar文件并查看源代码。我想保护源代码不被看到。一种可能的方法是像我们为zip文件做的那样密码保护该文件。

但是,如果知道密码,那么源代码可以轻松地被看到。

有没有隐藏源代码的方法,同时仍然能够运行?类似于Windows中的.exe。这应该在Windows和Linux环境下运行。


4
我理解您的意思是class文件可以被反编译,而不是您实际上将源代码和Jar文件一起发布。 - MadProgrammer
你的目的是什么?是为了阻止随意浏览者吗?还是尽可能保护你的专有算法? - thkala
5个回答

5

简单的.exe打包在HEX编辑器下很容易被发现。打包和加密并不能防止人们附加调试器并挑出代码。 - nhahtdh
那么不要将你的jar / exe分发给用户,而是在云中运行它。将jar打包成exe和其他东西已经过时了。 - gerrytan
@nhahtdh:Proguard也可以进行真正的混淆。它会更改方法等名称,以使其不再对反向工程师有所帮助。 - President James K. Polk

5
你要搜索的是“Java混淆”。有很多工具可以帮助你进行混淆,但如果那些想要你的代码的人真的想要它,这是一场失败的战斗。如果这是一个严重的问题,你应该用C++编写。

4
当然,如果人们真的想要你的代码,C++ 只是略微更大的障碍。 - user166390
1
托管C++实际上只是C#,与Java并没有太大的区别。真正编译的C++可以被反汇编或反编译,但结果并不总是那么有用。最终,如果你手头拥有对象,给足够的时间,你可以进行逆向工程。如果你真的想隐藏一个算法,你可以在服务器上运行它,而不是分发对象代码。 - Peter Wooster
9
或者你可以用Perl编写它,然后分享源代码。通常即使作者一两周后也无法解码它 :) - Peter Wooster
我确实看到你是想开个玩笑。但是,当你听/看了几百次之后,那个特定的笑话就不再好笑了。特别是因为你含沙射影地侮辱了Perl程序员,暗示他们不能编写可读的代码。 - Stephen C
@stephanc 对不起,我并没有针对Perl程序员的意图,因为我曾经也是其中之一。1996年,我用Perl和HTML编写了一个完整的电影数据库。在这个过程中,我学会了如何编写正则表达式。我仍然在书架上保存着《Camel Book》的副本,并经常参考它来解决正则表达式的微妙问题。当然,任何语言都可以编写出难以阅读的代码,就像你可以编写易于阅读的代码一样。我曾经看到过很多漂亮而酷炫的Python程序被100多个字符的正则表达式语句破坏,这些语句根本无法提示它们的作用。 - Peter Wooster
显示剩余2条评论

5
严格来说,这并不是完全正确的。除非你已经将源代码文件包含在 JAR 文件中,否则其他人无法看到原始源代码。但他们可以(通常)反编译 JAR 文件中的“.class”文件为 Java 源代码,该代码与您的原始源代码在功能上等效。
正如其他答案所述,您可以采取措施使试图反向工程您的代码的人更难;例如使用混淆器或自定义类加载器,在 JAR 文件中以加密形式存储代码的情况下解密代码。但是,您所能做的任何事情都不足以防止决心坚定的黑客打败您的措施。什么都不行。
保护代码免受反向工程的唯一实用方法是不发布它。或使用软件许可证或其他法律手段来实现您的目的。

从我所见(实际上只是一些非常简单的情况,如果在复杂情况下不适用,请纠正我),Java代码-->字节码并没有进行太多优化,因此反编译后的代码与原始Java代码非常相似。 - nhahtdh
1
这是正确的。但它不同。它不是源代码 - Stephen C

3
如果您只是想阻止普通用户查看代码,那么Java的许多代码混淆工具都可能有所帮助。它会使字节码混乱不堪,从而使您的算法不太明显。
另一方面,如果您需要“绝对”的保护,任何加密/混淆工具都是无用的 - 如果您的计算机可以运行它,则一个决心和知识渊博的攻击者最终将能够弄清楚您的代码如何工作。
几个可能的解决方案:
- 使用客户端/服务器架构在您拥有的计算机上运行专有部分,这样您就不必在客户端应用程序中包含更有趣的部分代码。当然,由于各种原因,这种解决方案并不总是可行的。 - 雇用一些专门从事知识产权问题的律师,并申请专利来保护您的算法。在我看来,这比试图将技术解决方案强加于非技术问题要好得多...

0

搜索“Java混淆”。有很多工具可以帮助实现这一点,但如果有人真的想要检索源代码,你无法阻止他。

为了实现与安全相关的内容,您应该使用C++编写代码,然后创建动态库(Windows为.dll,Linux为.so),并使用Java JNI来使用它们。

在Windows上,您可以使用mingw来编译代码。

看一下这个链接: https://www3.ntu.edu.sg/home/ehchua/programming/java/JavaNativeInterface.html


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