签名以保护 JAR 免受逆向工程
Posted
技术标签:
【中文标题】签名以保护 JAR 免受逆向工程【英文标题】:Signing for protecting the JAR from reverse-engineering 【发布时间】:2019-10-11 09:08:21 【问题描述】:我正在考虑如何保护 JAR 免受逆向工程的影响。
(问题 1):
如果 JAR 是通过签名来签名的,那么签名是否能够保护 JAR?如果不是,那签的目的是什么?
(问题 2):
android APK 可以通过平台签名进行签名,并且无法从 APK 本身中提取平台签名。
从这个角度来看,我认为签名可以用来保护一些东西。但是为什么我们可以反编译任何被平台签名保护的APK呢?
【问题讨论】:
1.不会。它可以防止其他人更改 jar 的内容并声称它是合法的。 如果您需要难以对 jar 进行逆向工程,请查看此owasp.org/index.php/Bytecode_obfuscation 【参考方案1】:想想你自己的签名,你用钢笔写的。在纸上签名是否会使纸上的内容无法阅读?
不:它只是让阅读论文的人表明它是你写的(或者你同意它的内容,或者其他什么)。
签名罐子也是如此:它所做的只是向人们表明您(或您授权使用签名的人)制作了它,以便其他人无法更改罐子内容并将其呈现为“正宗”。
签名不会帮助您阻止逆向工程。
【讨论】:
谢谢你,@Andy Turner。【参考方案2】:如果 JAR 是通过签名来签名的,那么签名是否能够保护 JAR?如果不是,那签的目的是什么?
如果您签署合同,是否可以防止任何相关方违反合同?!不,它没有。签名只是(理论上)合法地识别您的东西。
这就是签署软件的全部意义:告诉软件的用户:“这是我的交付,你可以信任它,因为我签署了它(并且没有其他人可以改变它)”。
签名没有任何作用来保护您的内容免受逆向工程。它们仅对您的内容的用户有用,因为他们可以“确定”他们确实在使用 您的 内容,而不是第三方伪造并声称是您的内容 送货。
唯一的保护是查看混淆您的 JAR 文件内容。有一些工具(尤其是在 Android 上)。尽管如此,Java 的混淆并不完全完美。例如,请参阅here。
【讨论】:
@Global 有点无关紧要。你问了关于签名的问题,那部分得到了回答。如前所述:Java 中的混淆世界并不直截了当,也不完美。但是对于那个特定的主题,这里已经有很多问题了。所以先研究这些。请不要忘记在某个时候接受其中一个答案。 感谢您的帮助。 我删除了我的原始评论,因为它包含一个可能不适合这里的外部网站链接。再次感谢您。【参考方案3】:如果 JAR 是通过签名来签名的,那么签名是否能够保护 JAR?如果不是,那签的目的是什么?
正如其他人所指出的那样,它可以防止其他人以您的名称/品牌分发他们自己的代码副本。例如,假设您编写了一个计算器并在 github 上发布了一个签名的字节码,那么我不能编写自己的字节码并声明(不会被发现它是一个错误的,除非我找到它签名的密钥,它本身非常非常...不太可能)它是您的计算器的副本。
但是为什么我们可以反编译任何被平台签名保护的APK呢?
因为,它并不妨碍我们反编译。我们可以从这些 APK 中获取源代码,但是,我们不能喜欢将我们自己的任意代码放在它的位置,让其他人认为它与您的相同。
简单来说,签名是代码来源和真实性的证明,仅此而已。
编辑:
为什么我们不能从 APK 中提取原始签名?为什么不可能?
因为签名是一个散列,使用加密散列函数和一个只有您持有的密钥(称为私钥)和一个免费提供的公钥生成。由于该私钥与您同在,并假设您使用了强大的加密哈希函数,因此试图模拟该密钥的人通过直接尝试所有可能的哈希来找到该密钥将花费大量时间,这通常是唯一的可能的方法,除非你有一个聪明的解决方法来找到关键。公钥是公开可用的,用于验证签名的真实性。
我们可以使用这种机制来保护我们的 JAR 吗?
取决于您要保护的内容。如果它是由其他人冒充,那么是的,有一段时间,只要他们不以某种方式偶然发现钥匙。很明显,它对逆向工程没有好处
【讨论】:
重点是:为什么我们不能从APK中提取原始签名?为什么不可能?我们可以使用这种机制来保护我们的 JAR 吗? 我编辑了它,也包括了所有这些。希望你得到回答,虽然我看到安迪已经这样做了:) 非常感谢您的详细解释。以上是关于签名以保护 JAR 免受逆向工程的主要内容,如果未能解决你的问题,请参考以下文章