【发布时间】:2016-10-03 03:00:32
【问题描述】:
我们使用批处理文件 (java -jar ..) 运行的商业 jar 与我们的签名一起分发。它不由 JNLP 触发。它还包含额外的 3rd 方库。如果任何恶意人员替换任何 java 类,jar 将停止运行,因为签名不匹配。但是,如果他从 jar 中删除 MANIFEST 文件,则不再进行检查。当任何类被替换、更改时,我们如何防止程序运行?一种选择是检查 java 源代码中的清单文件,如 Verifying Jar Signature 和 How 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