2011-10-22 93 views
6

我会正确地做到这一点,所以您不必阅读很多内容。Java加密存储器类加载器

基本上,我有一个AES-128位加密的Jar文件。我想制作一个启动器,以便我可以将此加密的Jar加载到内存中并运行它(使用密钥)。

我有一个简单的类加载器工作,但除非我解密到一个目录并运行它,它显然不会做我所需要的(解密&内存加载)。

TL; DR:我需要在内存中创建一个AES-128位加密Jar。

任何帮助非常感谢,随时提问!

+2

如果你希望你的代码是安全的,你可能不应该把它写在那里最容易反编译的语言之一。可以编写jar加载程序,但无法阻止人们将其从内存中转储出去。 – 0x5f3759df

+0

它需要用Java编译。不是因为我不能用其他语言编写代码,而是其他语言不支持我正在做的事情。 –

+0

@ 0x5f3759d C和C#也是如此,绝对是任何语言。它可能需要5分钟的时间,但最终如果有人想要jar文件,他会很容易地获得关键字(为CreateFile设置一个断点并在调试器中配置,可能为ReadFile添加一个找到的fd,你会得到它很容易)。虽然我在这里看不到问题 - 如果您已经拥有了类加载器,是什么阻止了您读取该文件并对其进行解密?即你真正的问题是什么? – Voo

回答

8

有关如何加载从byte[]一个JAR /类示例代码(这应该是这个结果,你在内存中解密之后获得/不需要在文件系统中的任何地方进行保存)看到http://www.javaworld.com/javaworld/jw-10-1996/indepth/indepth.src.html

基本上你需要使用defineClass来实现你想要的。

但请注意,这不提供真正的安全,因为所有的结束(解密后)为Java字节代码在内存中,因此可以访问/操作/保存等

安全的一点点有可能通过实现自定义的JVM和/或预JIT编译的代码,以便它是原生...一些信息,例如见How to create encrypted Jar file?

+0

谢谢!我会告诉你它是如何工作的。我也在想,更简单的选择是创建一个包含解密的jar /字节的临时文件。我将temp jar加载到内存中,然后将其从temp文件夹中删除。 –

+0

欢迎您......请不要忘记将upvote/mark标记为接受任何有帮助的答案! – Yahia

+0

我需要获得15个声望才能投票。但是当我达到15位代表时,我一定会确定的! –

1

This article是很好看的,说明为什么精美的气密代码的保护是根本可能。即使保持尽可能低的水平,您也可以变得更加困难,非常困难。将代码编译为本机指令,这些指令不是(干净地)使用常规语言结构表示的。

但是您应该记住,无论如何,最终您的加密数据将不得不使用某个密钥进行解密,并且即使只是简单地使用该密钥,但重要的一点是它最终会存储在内存中。用普通的操作系统和硬件无法解决这个问题。所以作为一名黑客,你总是可以退后一步,从内存中取回密钥,并从那里开始向后工作。不是普通用户能够做到的,但它肯定是可能的。