签名以保护 JAR 免受逆向工程

Signing for protecting the JAR from reverse-engineering

我在考虑如何保护 JAR 免受逆向工程。

(问题一):

如果JAR是通过签名签名的,那么签名是否能够保护JAR?如果不是,那么签名的目的是什么?

(问题2):

Android APK可以通过平台签名进行签名,无法从APK本身提取平台签名。

从这个角度来说,我觉得签名可以用来保护一些东西。但是为什么我们可以反编译任何有平台签名保护的APK?

想想你自己的签名,你用钢笔写的。在一张纸上签名是否会使纸上的内容无法阅读?

不:它只是让阅读该论文的人表明它是由您撰写的(或者您同意其内容,或其他)。

签名 jar 也是如此:它所做的只是向人们表明您(或您已授权使用签名的人)制作了它,以便其他人无法更改 jar 内容并呈现它作为 "authentic".

签名不会帮助您停止逆向工程。

If JAR is signed by signature, is the signature able to protect the JAR? If not, then what is the purpose of signing?

如果您签署一份合同,是否可以防止任何相关方违反合同?!不,它没有。签名只是(理论上)合法识别您的东西。

这就是签署软件的全部意义:告诉软件用户:"this is my delivery, you can trust it, because I signed it (and nobody else can have changed it)".

签名没有任何作用来保护您的内容免遭逆向工程。它们仅对您的内容的用户有用,因为它们可以是 "sure",他们确实在使用 您的 内容,而不是第三方伪造并仅声称成为你的送货。

唯一的保护措施是检查混淆 您的 JAR 文件内容。有相应的工具(尤其是在 Android 上)。尽管如此,对 Java 的混淆并不完全完美。例如,参见 here

If JAR is signed by signature, is the signature able to protect the JAR? If not, then what is the purpose of signing?

正如其他人指出的那样,它可以防止其他人在您的 name/brand 下分发他们自己的代码副本。例如,假设你在 github 上写了一个计算器和 post 一个带符号的字节码,那么我不能写我自己的字节码并声称(除非我找到密钥,否则不会被发现它是假的)它是用它签名的,这本身非常非常......非常不可能)它是你的计算器的副本。

But why can we decompile any APK even it is protected by platform signature?

因为,它并不妨碍我们反编译。我们可以从这些 APK 中获取源代码,但是,我们不能喜欢将我们自己的任意代码放在其位置并让其他人相信它与您的相同。

说白了,签名就是代码来源和真实性的证明,仅此而已。

编辑:

Why can't we extract the original signature from the APK? Why is it impossible?

因为签名是一个散列,使用加密散列函数和只有您持有的密钥(称为私钥)和一个 public 密钥生成,该密钥可免费获得。由于该私钥与您同在,并且假设您使用了强大的加密散列函数,因此试图冒充该密钥的人通过直接尝试所有可能的散列来找到该密钥将花费大量时间,这通常是唯一的可能的方法,除非你有一个聪明的 work-around 来找到钥匙。 public密钥公开可用,用于验证签名的真实性。

Can we use this mechanism for protecting our JAR?

取决于您要保护的内容。如果是其他人的冒充,那么是的,有一段时间了,只要他们没有以某种方式偶然发现密钥。很明显,它对逆向工程没有好处