【问题标题】:Java prevent tampering of certificate files (manifest) in jar filesJava 防止篡改 jar 文件中的证书文件(清单)
【发布时间】:2016-10-03 03:00:32
【问题描述】:

我们使用批处理文件 (java -jar ..) 运行的商业 jar 与我们的签名一起分发。它由 JNLP 触发。它还包含额外的 3rd 方库。如果任何恶意人员替换任何 java 类,jar 将停止运行,因为签名不匹配。但是,如果他从 jar 中删除 MANIFEST 文件,则不再进行检查。当任何类被替换、更改时,我们如何防止程序运行?一种选择是检查 java 源代码中的清单文件,如 Verifying Jar SignatureHow to verify a jar signed with jarsigner programmatically 所述,例如

jarFile jar = new JarFile(new File("path/to/your/jar-file"));

// This call will throw a java.lang.SecurityException if someone has tampered
// with the signature of _any_ element of the JAR file.
// Alas, it will proceed without a problem if the JAR file is not       signed at all
InputStream is = jar.getInputStream(jar.getEntry("META-INF/MANIFEST.MF"));
Manifest manifest = new Manifest(is);

并检查 CodeSigners 等。

manifest.getCodeSigners();

但是当试图破坏 jar 的人执行反编译(例如使用 jad)时会发生什么?为了防止反编译,我们应用了一些混淆器,但是在反编译时,即使方法名称已更改,我们也可以看到逻辑。所以混淆是不够的。

你有什么建议?这是编写复杂的符号检查代码的好方法,例如使用反射 api、添加乱码数据、使用 goto 的一些意大利面条代码,还是您可以建议不同的程序来防止清单篡改以及使反编译器不成功?我检查了混淆器中的选项,但是在代码编写阶段我们可以做些什么来改进和加强混淆步骤?

【问题讨论】:

  • 我所做的一件事是将我的公钥嵌入到代码中,并使用该公钥检查签名。同样,它并不完美,没有什么是完美的,但它更强大,而且它确实依赖于清单和证书。

标签: java jar manifest obfuscation sign


【解决方案1】:

据我所知,这个问题目前还没有完美的解决方案。你可以阅读this,问题是一样的。到目前为止,混淆可能是最好的+简单的努力。我的意思是,不仅使用代码混淆器,而且你编写了奇怪的逻辑来隐藏你的算法,这样破解者就不能轻易地追踪逻辑和方法调用。

【讨论】:

    猜你喜欢
    • 2015-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-06
    • 2012-02-18
    • 2013-10-21
    • 2012-06-21
    • 1970-01-01
    相关资源
    最近更新 更多