如何创建加密的Jar文件?

时间:2009-02-11 16:26:19

标签: java sqlite encryption jar

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

6 个答案:

答案 0 :(得分:21)

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

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

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

答案 1 :(得分:9)

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

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

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

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

答案 2 :(得分:7)

Kosi2801非常正确。我能想到的唯一能做的就是以下,但这很难看。

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

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

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

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

答案 3 :(得分:3)

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

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

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

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

答案 4 :(得分:2)

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

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

答案 5 :(得分:1)

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