我正在编写一个作为 JAR 文件分发的软件。目前,这个 JAR 文件可以被篡改以检索和保存我们的服务器通过 URLClassLoader
传输的另一个文件,被反编译,并在我们的代码中找到各种为了客户端的安全而应该保持私有(private)的东西使用它。基本上,我想实现一种方法来检查原始 JAR 是否被篡改。我知道这是自相矛盾的,因为 Java 的性质可以被反编译,所以通过在原始类中实现 SignedObject
的有效性检查是不可能的,但是有没有其他方法可以确定代码是否原文件被篡改了吗?这种检查可以通过下载的中间类来检查有效性,或者通过任何其他可以保证工作的方式来进行。我整天都坐在这里试图想出解决这个问题的办法。欢迎任何帮助。
最佳答案
这在理论上和实践上都是不可能的。 jar 的验证发生在客户端。任何加密都不会以可验证的方式呈现给您,您相信客户提供任何加密。
即使您从 jar 文件本身请求任意字节以进行验证,恶意用户也可能将字节配置为从良好的 jar 中获取但由错误代码呈现。
您可以使用加密证明来确保另一方拥有数据,但不可能确保它只有该数据的副本/修订/版本。坚定的攻击者可以向您提供任何谎言,因为他可以在任何验证中声称他拥有有效的 jar。
简而言之,正确数据的存在并不意味着相同数据的排他性存在。
关于java - 检测 Java JAR/代码篡改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17711671/