2011-08-25 80 views
5

我正在一个项目中,我们需要加密.jar文件,所以没有人可以访问.class文件里面的jar文件....是否有任何Java编码这可以帮助我加密.jar文件?如何加密.jar文件

回答

13

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

由于第二个jar文件本身不能加密,恶意用户希望看到你的类文件,只需查看第二个jar文件中的类,然后解密你的超级机密jar文件并访问它。

也许你可以使用混淆器来提高代码的安全性,但它最终会保护(使它更难但不可能)你的类文件反编译而不是被使用。

如果模糊不够,你可以考虑将你的jar文件编译为一个windows或者一个用于unix/linux的SO,这会使得反编译变得更加困难,但并不总是可以正确地做到这一点,它是通常是PITA。 GCJ能够以某种方式做到这一点,还有其他商业产品将直接将.class/.jar编译成机器码。

但是,请考虑一下,放入多少安全并不重要,因为客户端计算机必须能够执行它,它必须能够读取它,所以无论您的代码将被暴露,您只能让它变得更难。

如果你确实有一个如此秘密的算法,你不想透露任何内容,不妨考虑把它转换成一个web服务,将它托管在你的服务器上,这样你就不必将实际的代码发送给客户端机器,并且还可以通过检查对其重要部分的访问来更好地防止未经授权的应用程序副本。

+0

实际上我想要保护.class文件免于访问.jar文件,您是否有办法做到这一点? –

+0

AlexR的建议是使用自定义类加载器来即时解密jar文件,这是可行的,并且或多或少是你所要求的,但请记住,任何安装了JAD的普通熟练程序员都可以无论如何反向工程你的自定义类加载器和访问类。我用另一种解决方案添加了一个段落,但这很不寻常。 –

1

不需要。因为您的程序需要能够运行代码,所以无论如何都没有意义。

尽管如此反编译.class文件导致可读性较差的代码(无意义的变量/类名称等),但您可以对代码进行混淆。

1

据我所知这不是标准的JVM支持。但是你可以做以下事情。将你的应用程序分成两部分。首先不会被加密。这将是一个简单的加载器,它将使用自定义类加载器来实例化其余部分。这个类加载器将以字节数组的形式获得类,解密并加载它们。

+0

虽然这是一些人使用的方法,但总有可能反编译自定义类加载器并破坏安全性。就像你可以读取解密的代码一样,你可以将它解密写出来。 :) – carlspring

0

如果你不想提供对jar文件内类文件的访问,为什么你应该提供你的jar与应用程序? 感觉就像你的问题在概念上有点错...

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

+0

与什么应用程序我可以提供我的.jar文件来保存.class文件从访问侧.jar文件? –

3

我假设您已经意识到,任何熟练的java编码人员都可以对您使用(或写入)的Java工具进行反向工程,并仍然解码应用程序的jar包?也可以编写自定义类加载器来读取您的“加密”代码,并且可以编写一个工具来绕过它。

即使使用模糊处理和字节码修改以及自定义类加载器,java也是可以被破解/可反编译的,并且数据源几乎总是处于可读状态。

3

您想混淆而不是加密jar文件。

在Java中这样做的一个流行选择是ProGuard

-1

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

0

如果你正在打包在jar中 - >只需将它重命名为jarname.ABCD或任何误导扩展名,甚至脱掉扩展名,并相应地指定jar名称在您的应用程序中。

0

在申请开始时提供密码或许可证检查。通过适当的身份验证,只有这样用户才能够进一步运行应用程序。

对于密码检查,您应该生成生成私钥 - 公钥的概念。 对于许可证,可以使用一些安装的软件或附加硬件来提供访问权限。