如何创建加密的Jar文件?

我正在研究必须保护数据的项目(揭示代码不是主要问题)文件。 我们正在使用Java + Netbeans。 是否有任何设施将以加密格式创建jar? 我们也使用sqlite作为数据库 – 因此将文本文件加密为加密格式也不适合我们。

创建加密的JAR是不可能的,因为执行的JavaVM必须以某种方式能够读取它想要执行的数据。 与VM类似,任何拥有适当工具和专有技术的人都可以从JAR中提取所有数据。

如果可以加密JAR,您还必须向想要执行JAR的客户端提供一些解密密钥或工具,这完全违背了加密的目的。

你能得到的最好的是混淆,但这对雄心勃勃的攻击者来说并不是真正的安全或障碍。

我同意Kosi2801。 类文件加密只是模仿安全性(请参阅http://www.excelsior-usa.com/articles/java-obfuscators.html )使用自定义ClassLoader可以破坏应用程序,例如在应用程序服务器中。

有更好的方法:在类文件中使用String常量的加密。 大多数商业混淆器具有此function,例如Allatori , Stringer Java Obfuscation Toolkit , Zelix KlassMaster , Smokescreen , DashO (超级昂贵)。 Stringer Java Obfuscator具有调用上下文检查和完整性控制function ,这使得保护很难被破解。

最安全的方法是在JavaCard等外部设备上存储和执行部分字节码。

NB我是Licel LLC的首席执行官。 Stringer Java Obfuscator的开发人员。

Kosi2801非常适合。 我能想到的唯一能做的就是以下,但它很难看。

  1. 发送小型标准JAR和加密数据文件。
  2. 当JAR运行时,它会将(某些)加密数据文件解密到内存中(就像数据在JAR中的目录一样,基本上是指针/长度对的简单内存文件系统)
  3. 设置自己的类加载器,在调用时,从JAR获取正确的加密字节(使用#2中描述的伪FS表),对其进行解密,然后从那里加载类数据

这将允许您加载类。 你可以做同样的事情(没有类加载器)来加载其他资源。

尽管实施起来很有趣(对于那些喜欢挑战的人),但是有一些问题:

  1. 您需要能够解密这些内容,因此用户每次都必须输入密码或类似的东西。 如果JAR知道足以解密它的自我,那么任何人都可以查看它并弄清楚如何解密。 这可以通过在互联网上联系已知良好的服务器来请求解密密钥(只要您使该过程安全)来减轻。 当然,只要有人想要运行程序,这就需要一个活动的“网络连接”。
  2. 一切都在记忆中结束 。 如果没有一个处理微小加密字节代码的自定义JVM(正如Cameron McKay所提到的那样),这些类最终会在某个时刻被解密。 除非你依靠操作系统来阻止其他人阅读那些记忆,否则你已经失去了与他们手上一点时间的人的战斗。 您尝试从某些加密存储中读取的资源(例如图像/字体/等)也存在同样的问题。

因此,你可以给人们带来复苏,让事情变得更加艰难,但在你所给予的一切情况下,你所能做的就是尽量让对方不得不投入时间。

软件保护很难,特别是像Java这样容易被反编译的东西,不能像C / Assembly那样改变它自己的代码。 有一些原因,一些最昂贵的软件需要硬件加密狗或锁定到某个CPU或其他硬件。

通常,如果您希望应用程序及其数据是自包含的,则无法以安全的方式执行此操作。 但是,您当然可以加密文件并使用隐藏在代码中的密钥对其进行描述。 一个坚定的黑客可以得到它,但如果这不是你担心的,那很好。 如果这样做,请记住无法压缩加密数据,因此首先进行压缩,然后进行加密。

如果您确实需要数据是安全的(例如,机密数据),您将需要使用密钥加密数据并将该密钥提供给应用程序我的一些外部手段,例如将其放在拇指驱动器上并将其传递给用户通过安全快递。

另一种可能是通过SSL使数据(或密钥)可用,并使用良好的身份validation方法来validation您的用户是谁。

一般而言 – 任何系统都不可能完全安全,但它也不是必需的。 一个系统只需要足够安全,以阻止你认为会试图破解它的攻击者。

另一种选择是制作一个自动解密JAR的自定义JVM。 但同样的问题仍然存在:在某些时候,JAR Java类必须被解密以由JVM运行,并且在那时它们可以被捕获和解编译。

更不用说拥有自定义JVM会要求所有用户也下载该JVM。

您可以使用CipherOutputStream和CipherInputStream以加密格式将Java对象序列化到磁盘。 这可以是用于保存数据的选项。