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

时间:2019-05-24 18:48:29

标签: java android reverse-engineering signature

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

(问题1):

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

(问题2):

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

从这个角度来看,我认为签名可以用来保护某些东西。但是,为什么即使有受平台签名保护的APK,我们也可以反编译它呢?

3 个答案:

答案 0 :(得分:3)

考虑一下自己用笔写的签名。签署一张纸会使纸上的内容以某种方式无法阅读吗?

否:它只是给阅读本文的人一个表明它是您撰写的指示(或者您同意其内容,或其他)。

对jar进行签名也是如此:所做的一切都是向人们表明您(或您已授权使用签名的人)产生了jar,以便其他人无法更改jar内容并将其显示为“真实”。

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

答案 1 :(得分:2)

  

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

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

这就是 signing 软件的全部要点:告诉软件用户:“这是我的交付,您可以信任它,因为 I 已对其进行了签名(并且没有其他人可以更改它)”。

签名没有任何作用来保护您的内容免遭逆向工程。它们仅对您的内容用户有用,因为它们可以“确定”,他们确实在使用您的内容,而不是第三方伪造的,只是声称您是您的内容交付。

唯一的保护措施是混淆您的JAR文件内容。有用于该目的的工具(尤其是在Android上)。但是,对Java的混淆并不完全完美。例如,请参见here

答案 2 :(得分:2)

  

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

正如其他人指出的那样,它可以防止其他人以您的名字/品牌分发自己的代码副本。例如,假设您编写了一个计算器并在github上发布了一个已签名的字节码,那么我将无法编写自己的字节码并声明(除非被发现它是一个虚假的字节码,除非我找到了对其进行签名的密钥,该密钥本身非常非常……非常不可能),它是您的计算器的副本。

  

但是,即使受平台签名保护,我们为什么也可以反编译任何APK?

因为,这不会阻止我们进行反编译。我们可以从此类APK中获取源代码,但是,我们不喜欢将自己的任意代码放在其位置,而让其他人相信它与您的相同。

简单地说,签名是代码来源和真实性的证明,仅此而已。

编辑:

  

为什么我们不能从APK中提取原始签名?为什么不可能?

因为签名是使用密码哈希函数和只有您持有的密钥(称为私钥)和公用密钥(免费提供)生成的哈希。由于该私钥与您同在,并假设您使用了强大的加密哈希函数,因此试图模拟该私钥的人通过直接尝试所有可能的散列来找到该私钥将花费大量时间,通常这是唯一的除非您有一个聪明的解决方法来找到密钥,否则可能的方法。公钥是公开可用的,用于验证签名的真实性。

  

我们可以使用这种机制来保护我们的JAR吗?

取决于您要保护的内容。如果是其他人的模仿,则可以,只要他们不以某种方式偶然发现钥匙,就可以。显而易见,逆向工程是不利的