在运行时检索Android的apk签名

在运行时检索Android的apk签名,android,Android,是否有某种方法可以在运行时检索有关apk签名的信息 例如,我使用两个不同的签名对同一个应用程序进行签名:App-1.apk和App-2.apk,我希望能够在运行时区分这两个apk。可能吗 我的目标是使用外部服务器并基于应用程序的版本代码和签名实现许可证系统。这可能是另一种方法,但为什么不实现基于签名的自定义权限呢?然后,您可以使用包管理器(或广播)来确定是否授予了该权限 如果是,则两个签名是相同的,如果不是,则是不同的 您可以使用PackageManager访问apk签名。 PackageMan

是否有某种方法可以在运行时检索有关apk签名的信息

例如,我使用两个不同的签名对同一个应用程序进行签名:App-1.apk和App-2.apk,我希望能够在运行时区分这两个apk。可能吗


我的目标是使用外部服务器并基于应用程序的版本代码和签名实现许可证系统。

这可能是另一种方法,但为什么不实现基于签名的自定义权限呢?然后,您可以使用包管理器(或广播)来确定是否授予了该权限


如果是,则两个签名是相同的,如果不是,则是不同的

您可以使用PackageManager访问apk签名。 PackageManager中定义的PackageInfo标志返回有关包中包含的签名的信息

Signature[] sigs = context.getPackageManager().getPackageInfo(context.getPackageName(),PackageManager.GET_SIGNATURES).signatures;    
for (Signature sig : sigs)
{
    Log.i("App", "Signature : " + sig.hashCode());
}

没错,只是API称之为“签名”的实际上是签名证书。调用
toByteArray()
获取原始证书。另外,
hashCode()
并不能给您带来很多好处,您需要使用
MessageDigest
计算证书哈希值以进行比较。@NikolayElenkov这可能是一篇旧文章,但我需要实现这段代码。签名证书和原始证书有什么区别?当我使用您的方法
toByteArray()
而不是
hashCode()
my
MD5
时,每次再次运行
.apk
时,校验和都会发生变化,而仅使用
hashCode()
可以保持它的稳定,除非我重新编译应用程序。我想要的是标识用于对
进行签名的密钥库。apk
hashCode()
不返回MD5校验和,它或多或少是一个在运行时标识对象的随机值。使用
MessageDigest.getInstance(“MD5”).digest(sigs[0].toByteArray())
。顺便说一句,识别“密钥库”没有意义,您需要识别签名密钥/证书。经过一些测试,我了解了您所说的
hashCode
是指识别签名对象以及签名中包含的内容。然而,在查看签名类之后,我被
toByteArray
toCharString
之间的差异弄糊涂了。逻辑告诉我一个是字节,一个是字符。散列其中一个与另一个有区别吗?此外,toByteArray似乎在每个运行时都会更改,而toCharString则不会。我用toCharString来代替是不是不对?感谢您在这么长时间帮助我之后发表评论。:)但是,如果我们要基于签名对web服务调用进行身份验证,那么任何应用程序都可以看到应用程序签名并使用它进行攻击。