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>=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/