【问题标题】:How to create encrypted Jar file? [closed]如何创建加密的 Jar 文件? [关闭]
【发布时间】:2010-10-06 23:02:27
【问题描述】:

我正在处理必须保护数据(显示代码不是主要问题)文件的项目。我们正在使用 Java + Netbeans。是否有任何工具可以以加密格式创建 jar?我们也在使用 sqlite 作为数据库 - 所以将文本文件以加密格式放置对我们来说也是不合适的选择。

【问题讨论】:

  • 你的设计有缺陷;将敏感数据与代码一起发送并不是一个聪明的主意。
  • 它是桌面应用程序。 Java 用于跨平台兼容性。
  • 如果您需要保护数据,请考虑使用 SqlCipher。如果您愿意,可以发送已加密的数据库文件。

标签: java sqlite encryption jar


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

        Kosi2801 几乎是正确的。我能想到你唯一能做的就是以下,但这很丑。

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

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

        虽然实现起来很有趣(对于那些喜欢挑战的人来说),但这也存在一些问题:

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

        所以你可以让人们绕道而行,让事情变得更难,但在你已经给予的情况下,你所能做的就是试图让其他人不得不投入的时间不值得。

        软件保护非常困难,尤其是像 Java 这样可以轻松反编译并且不能像 C/Assembly 那样更改自己的代码的东西。一些最昂贵的软件需要硬件加密狗或锁定到某个 CPU 或其他硬件是有原因的。

        【讨论】:

        • 现在我明白了,当我使用爱立信 TEMS 时,为什么我必须一直使用 USB 加密狗来运行它,令人惊讶的是,USB 上没有数据,但没有它就无法工作
        【解决方案5】:

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

        如果您确实需要保护数据(例如机密数据),则需要使用密钥加密数据,并通过一些外部方式将该密钥提供给应用程序,例如将其放在拇指驱动器上并获取通过安全的信使向用户发送。

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

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

        【讨论】:

          【解决方案6】:

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

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

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

          注意我是 Licel LLC 的首席执行官。 Stringer Java 混淆器的开发者。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2011-09-19
            • 1970-01-01
            • 2011-11-03
            • 2012-03-29
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多