Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在应用程序启动时检查android证书序列号?_Android_Security_Encryption_X509certificate_Android Build - Fatal编程技术网

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

在应用程序启动时检查android证书序列号?,android,security,encryption,x509certificate,android-build,Android,Security,Encryption,X509certificate,Android Build,我继承了一个安卓应用程序,它有一些与安全相关的代码,基本上看起来是不可操作的,我想删除这些代码。然而,我担心我的评估可能是不正确的。应用程序子类应用程序,并在其onCreate()方法中获取应用程序签名时使用的证书的序列号: ByteArrayInputStream bais = new ByteArrayInputStream(context.getPackageManager().getPackageInfo(context.getPackageName(), PackageManager.

我继承了一个安卓应用程序,它有一些与安全相关的代码,基本上看起来是不可操作的,我想删除这些代码。然而,我担心我的评估可能是不正确的。应用程序子类应用程序,并在其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();
然后计算该值的散列,并将其与作为字节[]嵌入Java类中的预期值进行比较。如果哈希值不匹配,它会抛出一个异常,导致应用程序崩溃

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


准确吗?或者,我之所以不知道这段代码有用,是因为什么原因?

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

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

如你所说,如果有人在应用程序中遇到麻烦,他们可以删除该安全检查


这只不过是另一个让爆竹跳过去的篮筐而已。考虑保留它,但一定要检查签名,而不仅仅是序列号。

从我可以看出,所有的检查都是验证(在运行时),应用程序被签署的证书是同一个“我们预期”它已经被签署。所以它可以防止有人拿走apk,以某种方式修改它,重新签名,然后把它作为自己的东西放回商店。但是,在这种情况下,我希望攻击者能够删除该检查。否?它不会验证它是否是相同的证书…只是证书具有相同的序列号。我可以用我想要的任何序列号创建我自己的证书,然后签名,如果我正确理解您的支票正在做什么,支票就会通过。更好的检查是散列整个证书并比较该散列。或仅由指定的受信任证书颁发机构签署的信任证书。但即便如此,如果有人可以反编译应用程序,他们当然可以更改您在代码中添加的任何安全措施,重新编译它,并将其声明为自己的。@gtrig,您是对的。我误解了这个问题。他们应该检查签名,而不是序列号。我会更新我的答案。顺便说一下,签名是证书的散列。你指的是证书签名,对吗?如果是自签名证书,此检查仍然没有意义。我可以用我想要的任何序列号签署我自己的证书,签名将是有效的。:)如果是由应用程序信任的CA颁发的证书,则更好,在这种情况下,签名检查实际上是有意义的。@gtrig,如果签名匹配,则证书匹配。这个想法不是为了检查一个有效的签名(Android就是这样做的)。这是为了检查一个特定的签名。