【问题标题】:Retrieve the apk signature at runtime for Android在运行时为 Android 检索 apk 签名
【发布时间】:2011-12-30 18:34:26
【问题描述】:

有没有办法在运行时检索有关 apk 签名的信息?

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

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

【问题讨论】:

    标签: android


    【解决方案1】:

    您可以使用 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

    【讨论】:

    • 对,除了 API 调用的“签名”实际上是签名 证书。致电toByteArray() 获取原始证书。另外,hashCode() 对你没有什么好处,你需要使用MessageDigest 计算证书哈希值进行比较。
    • @NikolayElenkov 这可能是一篇旧帖子,但我需要实现此代码。签名证书和原始证书有什么区别?当我使用您的方法toByteArray() 而不是hashCode() 时,每次我再次运行.apk 时,我的MD5 校验和都会发生变化,而仅使用hashCode() 会使其保持稳定,除非我重新编译应用程序。我想要的是识别用于签署.apk 的密钥库。
    • hashCode() 不返回 MD5 校验和,它是在运行时识别对象的或多或少的随机值。使用MessageDigest.getInstance("MD5").digest(sigs[0].toByteArray())。顺便说一句,识别“密钥库”没有意义,您需要识别签名密钥/证书。
    • 经过一些测试,我意识到hashCode 的意思是识别签名对象以及签名中包含的内容。但是,在查看 Signature 类之后,我对toByteArraytoCharString 之间的区别感到困惑,逻辑告诉我一个以字节为单位,一个以字符为单位。散列一个或另一个之间有区别吗?此外,似乎 toByteArray 每次运行时都会更改,而 toCharString 不会。改用 toCharString 对我来说是错的吗?感谢您在这么长时间帮助我之后发表评论。 :)
    • 但是如果我们要基于签名对 Web 服务调用进行身份验证,就会发现任何应用程序都可以看到您的应用程序签名并使用它来破解。
    【解决方案2】:

    这可能是一种不同的方法,但您为什么不直接实现基于签名的自定义权限?然后你可以使用包管理器(或广播)来查明权限是否被授予。

    如果是,则两个签名相同,否则它们不同。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-05-08
      • 1970-01-01
      • 1970-01-01
      • 2014-09-13
      • 2015-01-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多