Java 签署保护JAR不受反向工程影响的协议

Java 签署保护JAR不受反向工程影响的协议,java,android,reverse-engineering,signature,Java,Android,Reverse Engineering,Signature,我在考虑如何保护罐子不受逆向工程的影响 (问题1): 如果JAR是通过签名进行签名的,那么签名是否能够保护JAR?如果没有,那么签署的目的是什么 (问题2): Android APK可以通过平台签名进行签名,从APK本身提取平台签名是不可能的 从这个角度来看,我认为签名可以用来保护某些东西。但为什么我们可以反编译任何APK,即使它受平台签名保护?想想你自己的签名,你用钢笔写的。在一张纸上签名是否会使纸上的内容无法阅读 不:它只是给阅读报纸的人一个暗示,表明它是你写的(或者你同意它的内容,或者其他

我在考虑如何保护罐子不受逆向工程的影响

(问题1):

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

(问题2):

Android APK可以通过平台签名进行签名,从APK本身提取平台签名是不可能的


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

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

不:它只是给阅读报纸的人一个暗示,表明它是你写的(或者你同意它的内容,或者其他什么)

对一个jar进行签名也是如此:它所做的只是给人们一个指示,表明您(或您授权使用签名的人)制作了它,以便其他人不能更改jar内容并将其显示为“真实的”

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

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

如果你签了一份合同,这能防止任何相关方违约吗?!不,没有。签名只是(理论上)合法地识别你的东西

这就是签署软件的全部意义:告诉软件用户:“这是我的产品,你可以信任它,因为I签署了它(没有人可以更改它)”

签名不做任何事情来保护您的内容免受反向工程的影响。它们只对您内容的用户有用,因为他们可以“确定”他们真的在使用您的内容,而不是第三方伪造的东西,并且只声称是您的内容

唯一的一种保护是对JAR文件内容进行模糊处理。有这样的工具(特别是在Android上)。尽管如此,Java的模糊处理并不完全完美。例如,见

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

正如其他人所指出的,它阻止其他人以您的名义/品牌分发自己的代码副本。例如,假设您编写了一个计算器,并在github上发布了一个签名字节码,那么我就无法编写自己的字节码并声明它是您的计算器的副本(除非我找到了签名的密钥,它本身是非常非常不可能的),否则我不会发现它是一个错误的字节码

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

因为,它不会阻止我们进行反编译。我们可以从这些APK中获得源代码,但是,我们不能把自己的任意代码放在它的位置上,让其他人相信它与您的相同

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

编辑:

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

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

我们可以用这个机制来保护我们的罐子吗


这取决于你想保护什么。如果这是别人的模仿,那么是的,只要他们没有以某种方式偶然发现钥匙。显而易见,这对反向工程没有好处。不可以。它可以防止其他人更改罐子的内容并声称它是合法的。如果您需要使您的反向工程变得困难,请检查此项jar@Global有点不相干。你问到签名的问题,那部分得到了回答。如前所述:Java中的模糊处理世界不是直截了当的,也不是完美的。但对于这个特定的话题,这里已经有很多问题了。所以先研究一下这些。请不要忘记在某个时候接受其中一个答案。谢谢你的帮助。我删除了我的原始评论,因为它包含一个来自外部的网站链接,可能不适合这里。再次感谢你。谢谢你,@Andy Turner。问题是:为什么我们不能从APK中提取原始签名?为什么不可能?我们可以用这个机制来保护我们的罐子吗?我编辑了它,包括所有这些。希望你得到回答,虽然我看到安迪已经这样做了:)非常感谢你的详细解释。