【发布时间】:2011-12-30 18:34:26
【问题描述】:
有没有办法在运行时检索有关 apk 签名的信息?
例如,我有同一个应用程序使用 2 个不同的签名进行签名:app-1.apk 和 app-2.apk,我希望能够在运行时区分这两个 apk。那可能吗?
我的目标是使用外部服务器并基于应用程序的版本代码和签名来实施许可系统。
【问题讨论】:
标签: android
有没有办法在运行时检索有关 apk 签名的信息?
例如,我有同一个应用程序使用 2 个不同的签名进行签名:app-1.apk 和 app-2.apk,我希望能够在运行时区分这两个 apk。那可能吗?
我的目标是使用外部服务器并基于应用程序的版本代码和签名来实施许可系统。
【问题讨论】:
标签: android
您可以使用 PackageManager 访问 apk 签名。 包管理器中定义的 PackageInfo 标志返回有关包中包含的签名的信息。
Signature[] sigs = context.getPackageManager().getPackageInfo(context.getPackageName(),PackageManager.GET_SIGNATURES).signatures;
for (Signature sig : sigs)
{
Log.i("App", "Signature : " + sig.hashCode());
}
http://developer.android.com/reference/android/content/pm/PackageManager.html
【讨论】:
toByteArray() 获取原始证书。另外,hashCode() 对你没有什么好处,你需要使用MessageDigest 计算证书哈希值进行比较。
toByteArray() 而不是hashCode() 时,每次我再次运行.apk 时,我的MD5 校验和都会发生变化,而仅使用hashCode() 会使其保持稳定,除非我重新编译应用程序。我想要的是识别用于签署.apk 的密钥库。
hashCode() 不返回 MD5 校验和,它是在运行时识别对象的或多或少的随机值。使用MessageDigest.getInstance("MD5").digest(sigs[0].toByteArray())。顺便说一句,识别“密钥库”没有意义,您需要识别签名密钥/证书。
hashCode 的意思是识别签名对象以及签名中包含的内容。但是,在查看 Signature 类之后,我对toByteArray 和toCharString 之间的区别感到困惑,逻辑告诉我一个以字节为单位,一个以字符为单位。散列一个或另一个之间有区别吗?此外,似乎 toByteArray 每次运行时都会更改,而 toCharString 不会。改用 toCharString 对我来说是错的吗?感谢您在这么长时间帮助我之后发表评论。 :)
这可能是一种不同的方法,但您为什么不直接实现基于签名的自定义权限?然后你可以使用包管理器(或广播)来查明权限是否被授予。
如果是,则两个签名相同,否则它们不同。
【讨论】: