android - ILicenseResultListener.verifyLicense 的 signedData 参数是什么?

标签 android google-play

Android 上的 Google Play 有一个许可证检查服务,com.android.vending.licensing.ILicensingService。它支持回调接口(interface) ILicenseResultListener。它有一个带有三个参数的方法 verifyLicense。对于从 Google Play 下载的付费应用,请问第二个 signedData 是什么?

this这就是我想知道的原因。

最佳答案

答案在android-sdk-windows\extras\google\market_licensing\library\src\com\google\android\vending\licensing\ResponseData.java中的parse()方法中。

signedData 字符串是一个由 6 个字段组成的序列,由 | 分隔,后跟可选的冒号和一个 & 分隔的名称=值集合(类似于查询字符串)。例如:

0|17|com.acme.myapp|1|AAAAABBBBCCCCDDDDEEEEFFFFGGGGHHHHH==|1480563297411:GR=10&VT=1480570457760&GT=1481088857760

这个来自付费应用。

第一部分的 6 个字段是:

  • 响应代码 (int) - 可能与 verifyLicense 的第一个参数相同
  • Nonce (int) - 直接来自 checkLicense 调用
  • 包名
  • 版本号
  • 用户 ID,带有注释“特定于应用程序的用户标识符”
  • 时间戳(长)- 不确定是什么。坚决不买;重复运行返回一个不同的、后来的值。可能是许可证检查本身。

UserID 似乎是一个 Base64 编码的字符串。它识别哪个用户,如何识别?许可证持有人,一个假设;但是怎么办?解码得到一个字节数组,25 个字节长。

对于侧载应用程序,基本字段就是全部。对于商店购买的应用程序,有额外的数据。额外数据字段的含义可以找到here .具体来说,对于新购买的应用程序,会出现以下额外字段:

  • GR - 最大重试次数
  • VT - 许可证有效性时间戳;指定何时需要重新检查许可证
  • GT - 宽限期时间戳

关于UserID,我做了一些测试。我有三种情况:

  • A 包,侧载
  • A 包,从 Play 付费下载
  • 包 B,从 Play 免费下载(由同一用户)

在所有这三种情况下,解码后的 UserID 的前 5 个字节都匹配,其余的则不匹配。因此,无论是包唯一性部分还是用户唯一性部分都无法在 UserID 中轻松识别。值得注意的是,其余部分有 20 个字节长——可能是 MD5 散列。 UserID 绝对不是任何合理编码的字符串,而且它看起来也不像具有二进制整数的结构。看似随机的位模式指向哈希或密文。后者不太可能。

关于android - ILicenseResultListener.verifyLicense 的 signedData 参数是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40894999/

相关文章:

android - 无法在 Playstore 中按应用名称找到应用

android - Play 商店的替代条目

java - 如何在 libgdx 项目中使用 android 类?

android - 使用数组适配器的微调器实现

android - 为什么 Google 认为我的应用正在发送有关已安装应用的数据?

android - 如何在Android中测试应用内更新?

java - Eclipse 崩溃但是创建签名的 apk

android - 广播结果始终为零

android - Android Studio Gradle依赖性检查

android - 如何查看Android应用在其他国家的下载量?