在应用程序启动时检查Android证书序列号?

时间:2013-11-18 15:15:47

标签: android security encryption x509certificate android-build

我继承了一个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类中的期望值进行比较。如果散列不匹配,则会抛出异常,从而导致应用程序崩溃。

这似乎阻止了有人窃取我们的源代码,构建应用程序并自行签名,然后尝试安装并运行它。但是,如果有人拥有源代码,他们只需在应用启动时删除支票即可。 (或更改嵌入的哈希值以匹配其证书的序列号。)

这是准确的吗?或者是否有一些原因我错过了这段代码是否有用?

1 个答案:

答案 0 :(得分:0)

我认为这不是为了保护人们免于窃取您的源代码。这是为了防止人们更换所有资产,从而将应用程序重新命名为自己的应用程序,然后重新签名并将其作为自己的应用程序放入游戏商店。

但是,程序不应该验证序列号,这很容易修改。它应该验证签名。

如果有人遇到decompiling该应用的问题,正如您所说,他们可以删除该安全检查。

这只是一个让饼干跳过的另一个箍。考虑保留它,但一定要检查签名,而不仅仅是序列号。