【问题标题】:Detect Java JAR/Code Tampering检测 Java JAR/代码篡改
【发布时间】:2013-07-17 22:54:05
【问题描述】:

我正在编写一个以 JAR 文件形式分发的软件。目前,这个 JAR 文件可以被篡改以检索和保存我们的服务器通过URLClassLoader 传输的另一个文件,被反编译,并在我们的代码中找到各种应该保持私有的东西,以确保使用它的客户端的安全。基本上,我想实现一种方法来检查原始 JAR 是否被篡改。我知道通过在原始类中检查 SignedObject 的有效性是不可能的,因为 Java 的性质可以被反编译,但是有没有其他方法可以确定代码是否被篡改原始文件?此检查可以通过下载的用于检查有效性的中间类或任何其他保证有效的方式进行。我整天都坐在这里试图想出解决这个问题的办法。欢迎任何帮助。

【问题讨论】:

  • 关于我能想到的唯一使用某种文件哈希 (MD5) 的方法,它可以判断 Jar 文件是否已被更改(即添加或删除或修改,但如果它有开始打开)。您可以将此信息保存在服务器上的某个位置。当要加载 Jar 时,您可以与服务器核对以确定 MD5 是否匹配(不要从服务器请求它,将它发送到服务器)。您还会使 Jar 过期,因此需要在一段时间后重新下载...
  • 我看到了这个问题。可以修改原来的 JAR 以保存下载的 JAR,看看检查是如何进行的,然后重新编译它以忽略有效性检查,我们又在同一条船上。
  • 当您的应用程序加载 Jar 时,它需要执行验证。是的,在某种程度上它可以被破坏,但这对于非技术人员来说是很多工作。如果 Jar 正在与 base 对话(即从服务器请求数据),它还可以传回一个密钥,您可以在将来的某个时间过期,需要下载一个新的 Jar(使用新密钥)。如果您是自己加载 Jar 的类,则可以加密 Jars/类
  • 密钥可能会被泄露并从修改后的 JAR 静态发送到服务器。这必须是不可能绕过的。我不在乎随便的乡巴佬能不能破坏验证。
  • 是的,您所做的任何事情都可能受到损害,那么您将要做什么。断开网络连接?您可以简单地将应用程序作为 Web 应用程序运行,但有一些方法可以突破这些限制。正如您所说,您永远不会找到绝对的解决方案。

标签: java jar signed-applet urlclassloader


【解决方案1】:

这在理论上和实践上都是不可能的。 jar 的验证发生在客户端。任何加密都不会以可验证的方式呈现给您,并且您相信客户端提供了任何加密。

即使您要从 jar 文件本身请求任意字节进行验证,恶意用户也可能配置从好的 jar 获取字节但由错误代码提供。

您可以使用加密证明来确保另一方拥有数据,但确保它只有该数据的副本/修订/版本是不可能的。一个坚定的攻击者可以向您提供任何谎言,因为他可以在任何验证中声称他拥有有效的罐子。

简而言之,正确数据的存在并不意味着排他性存在相同的数据。

【讨论】:

  • 我发现了同样的事情。当我触发手动交付 JAR 时,我最终使用套接字来交付 JAR。这不是最好的解决方案,但现在可以。
猜你喜欢
  • 2015-08-14
  • 2018-10-12
  • 2016-01-25
  • 1970-01-01
  • 1970-01-01
  • 2016-09-17
  • 1970-01-01
  • 1970-01-01
  • 2011-02-07
相关资源
最近更新 更多