【问题标题】:Access uniquely-identifying information about Android App programmatically?以编程方式访问有关 Android 应用程序的唯一标识信息?
【发布时间】:2013-02-08 08:57:51
【问题描述】:

当您将 .apk 上传到 Google Play 时,您会获得一个 Base64 编码的 RSA 公钥作为您的许可证密钥。如何在他们的 Android 应用代码中以编程方式访问相同的密钥?

其次,这个密钥是保持不变,还是每次您上传给定应用的更新时都会改变(大概是从 .apk 二进制文件生成的)?

如果是这样,您是否可以通过编程方式从应用程序中获取任何其他唯一标识信息,无论更新如何,这些信息都将保持不变。可以明确识别特定应用的东西?

一个简单的例子,如果一个库是专有的,但您想将其配置为仅适用于一组预先确定的 Android 应用程序。您可以通过在运行时验证有关正在使用它的应用程序的一些可通过编程方式访问的唯一信息来做到这一点。

非常感谢您的帮助

【问题讨论】:

    标签: android google-play


    【解决方案1】:

    您将用于许可验证和应用内结算的密钥与用于签署应用的密钥混淆了。您可以获得签名密钥with this。大多数应用程序不使用许可证密钥,如果需要,必须将其嵌入应用程序中。通常,应用程序由包名称和签名证书(或其哈希值)唯一标识。

    【讨论】:

    • 感谢您解决我的困惑。所以我理论上可以使用签名证书和包名称来验证应用程序的身份。这可能会随着更新而改变,还是保持不变?您能否提供一个代码示例来巩固我的理解?再次感谢您的回复
    • Play 商店对软件包强制执行相同的证书,因此不会更改。如果您从其他地方获得该应用程序,它可能已被重新打包并使用不同的密钥签名。不清楚你想做什么,所以很难制作样品。您可以通过(惊喜!)getPackage() 获得包裹,PackageManger 也有一些有用的方法。
    • 应用程序可以重新打包这一事实不是问题。根据您所说的,这样的事情是否可以可靠地获取有关应用程序的唯一信息(假设 SomeContextHandle 是 Context 的某个句柄): SomeContextHandle.getPackageManager().getPackageInfo(SomeContextHandle.getPackageName(),PackageManager.GET_SIGNATURES).signatures ?或 getPackage().getHashCode()??抱歉在这方面没有受过教育!
    • 如何获得“包裹证书”?
    • 看起来不错。所谓的“签名”实际上是编码证书。通常只有一个,所以signatures[0] 应该得到它。
    猜你喜欢
    • 1970-01-01
    • 2012-07-28
    • 1970-01-01
    • 2021-10-27
    • 1970-01-01
    • 1970-01-01
    • 2012-02-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多