【问题标题】:Protecting Java jar Files for Distribution保护 Java jar 文件以进行分发
【发布时间】:2009-08-14 23:43:38
【问题描述】:

我正在开发一个即将公开分发的应用程序。我愿意尽我所能确保下载我的程序的人不会对其进行逆向工程。我了解分发 .jar 文件非常不安全。

谁能推荐一种独立于平台的方式来分发我的 Java 应用程序?另外,我想将它作为服务安装在任何平台(Windows、Linux、Mac OSX)上。

谢谢!

【问题讨论】:

    标签: java security installation


    【解决方案1】:

    您可以使用 yGuard 或其他 java-bytecode-obfuscators 对您的字节码进行加扰/混淆。

    独立于操作系统的分发可能很困难。恕我直言,最好的解决方案是在程序支持的操作系统下包含几个脚本(.bat/.cmd 用于 windows,.sh 用于 linux / OSX)的普通存档。

    将 java 程序作为服务运行可能更加困难:在 Linux 下这很容易,您只需编写适当的启动脚本即可在后台运行它。我知道 FireDaemon 在将 java 程序作为服务运行时存在问题,因此在 Windows 上将其作为服务运行可能很困难(或不可能)。抱歉,我不知道 MacOS X。可能像 Linux 一样简单,可能像 Windows 一样不可能。

    【讨论】:

    • 混淆是要走的路。
    【解决方案2】:

    正如其他人所说,您可以混淆您的代码。这将使逆向工程变得不简单。您还可以使用(例如)GCJ 将您的 Java 编译为本机代码。这将使逆向工程变得更加困难,但这也意味着您必须为每个受支持的硬件/操作系统平台创建不同的分发包。

    我了解分发 .jar 文件非常不安全。

    您必须了解,如果您以任何形式分发软件以在您无法完全控制的平台上运行,那么您无法采取任何技术措施来防止逆向工程。什么都没有。

    最终,您必须在分发软件的好处与有人对其进行逆向工程的风险之间进行权衡。人们采取的一种方法是确定收益是否超过风险*成本,并使用法律保障措施(例如适当的软件许可证)来阻止逆向工程。另一种方法是向潜在的逆向工程师说“祝你好运”,并通过提供服务而不是软件许可来赚钱。

    【讨论】:

      【解决方案3】:

      通过混淆器运行您的应用程序会使逆向工程变得更加困难和昂贵。

      查看Java Service Wrapper,以相对简单的方式在多个平台上安装和运行您的 java 应用程序作为服务。

      【讨论】:

        【解决方案4】:

        您是否考虑过使用本机代码编译器,例如 GCJ?它不是独立于平台的(您必须为每个目标平台编译一个),但我看不出如何分发独立于平台的字节码,但对最终用户隐藏该字节码。

        【讨论】:

          【解决方案5】:

          您可以加密 jar,但您需要编写自定义类加载器来加载 jar 的内容。不过,这仍然不是 100% 万无一失的 - 一个简单的事实是,如果您的代码有针对性,您无能为力的任何事情都不会 100% 安全。请在此处查看此讨论。

          How to create encrypted Jar file?

          【讨论】:

          • 加密 JAR 文件的问题是您必须提供一些代码来解密文件以执行。可以对该代码进行逆向工程以确定解密密钥/算法。
          • @Stephen - 100% 同意。毫无疑问,这种方法就像一把挂锁——用来让诚实的人保持诚实。任何想要付出任何努力从 jar 中获取源代码的人都可以这样做。毕竟,一旦它被解码,它就可以从内存中读取。
          【解决方案6】:

          你可以混淆它。这将使您的程序的逆向工程更加困难。 另外,我认为您也可以使您的类文件可执行(即 Windows 的 .exe)

          编辑:老实说,如果您的应用程序的安全性如此重要,那么最好完全避免使用 java。例如,您可以为 c++ 使用 gcc 编译器(只要您不进行系统调用,它或多或少与平台无关)。您只需要在不同的主机上编译它(这是您最初的问题表明您需要但在 java 上的东西)。

          还有qt,不过我自己没试过那个。

          【讨论】:

          • 您可以制作可执行文件 - 但您所做的只是嵌入虚拟机。
          • 困难,但并非不可能。
          【解决方案7】:

          或者你可以像我一样做。带有某些用 c++ 编写的后端函数的 java 前端编译成通过 JNI 调用的 dll。前端 GUI 完全可移植,后端 grunt 在本机完成。

          【讨论】:

            猜你喜欢
            • 2022-06-10
            • 1970-01-01
            • 1970-01-01
            • 2019-04-18
            • 2011-10-29
            • 1970-01-01
            • 2012-11-01
            • 2018-04-20
            • 1970-01-01
            相关资源
            最近更新 更多