我继承了一个Android应用程序,它有一些安全相关的代码似乎基本上是一个无操作,我想删除。但是,我担心我对它的评估可能是不正确的。应用程序子类Application和onCreate()方法获取应用程序签名的证书的序列号:
ByteArrayInputStream bais = new ByteArrayInputStream(context.getPackageManager().getPackageInfo(context.getPackageName(), PackageManager.GET_SIGNATURES).signatures[0].toByteArray()));
X509Certificate cert = CertificateFactory.getInstance("X509").generateCertificate(bais);
BigInteger sn = cert.getSerialNumber();
然后计算该值的哈希值,并将其与作为byte []嵌入Java类中的期望值进行比较。如果散列不匹配,则会抛出异常,从而导致应用程序崩溃。
这似乎阻止了有人窃取我们的源代码,构建应用程序并自行签名,然后尝试安装并运行它。但是,如果有人拥有源代码,他们只需在应用启动时删除支票即可。 (或更改嵌入的哈希值以匹配其证书的序列号。)
这是准确的吗?或者是否有一些原因我错过了这段代码是否有用?答案 0 :(得分:0)
我认为这不是为了保护人们免于窃取您的源代码。这是为了防止人们更换所有资产,从而将应用程序重新命名为自己的应用程序,然后重新签名并将其作为自己的应用程序放入游戏商店。
但是,程序不应该验证序列号,这很容易修改。它应该验证签名。
如果有人遇到decompiling该应用的问题,正如您所说,他们可以删除该安全检查。
这只是一个让饼干跳过的另一个箍。考虑保留它,但一定要检查签名,而不仅仅是序列号。