在验证用户是否从 Google Play 商店购买或下载了您的应用的合法副本时,最好在您控制的服务器上执行许可验证检查。
本指南介绍了完成服务器端许可验证的分步过程,并提出了一些与执行此检查相关的最佳实践。
流程概览
图 1 显示了您的应用、Google Play 和您的私人服务器之间信息传输的方式。
- 您的应用向 Google Play 发出请求,询问特定用户是否购买或下载了您的应用的合法副本。
- Google Play 通过向您的应用发送一个响应数据对象来响应。该对象是
ResponseData
类型,是经签名的信息,说明用户是否购买或下载了您的应用的合法副本。 - 您的应用向您控制的私人服务器发出请求,验证响应数据的内容。
- 服务器通过向您的应用发送状态进行响应,指示用户是否确实购买或下载了您的应用的合法副本。如果服务器提供“成功”消息,请验证响应,然后授予用户访问需要许可的资源的权限。
由于响应数据由 Google Play 签名并在您的服务器上进行检查,因此无法在运行您的应用的设备上修改对象。如果您的应用依赖于服务器,并且只向合法用户提供资源,则您的应用将受到更强大的保护,免受未经授权的用户的侵害。
以下部分提供了执行服务器端许可验证时需要记住的其他注意事项。
防范重放攻击
在收到 Google Play 关于用户许可状态的响应后,用户可能会复制响应数据并多次使用,或者将其提供给其他用户,然后这些用户可能会伪造他们自己的请求到您的应用的私人服务器。这种行为被称为重放攻击。
为了降低用户成功执行重放攻击的可能性,在向您的应用的服务器发送请求之前,请采取以下措施:
检查响应数据中包含的时间戳,确保 Google Play 最近生成了该响应。
对您的服务器请求执行速率限制,例如指数退避,以减少您的应用尝试向您的应用服务器发送相同响应数据的次数。
在您的私人服务器上验证 Google Play 响应数据的内容之前,请向您的私人服务器发出初始的、基于身份验证的请求。在此第一个请求中,将用户凭据发送到您的服务器,然后让您的服务器用一个一次性随机数进行响应,即一个只使用一次的数字。然后,您可以将此一次性随机数包含在您向私人服务器发出的下一个请求中,请求许可验证数据。有关如何选择一个好的一次性随机数的值的详细信息,请参阅生成合适的一次性随机数部分。
生成合适的一次性随机数
使用以下技术之一创建难以猜测的一次性随机数:
- 根据用户 ID 生成哈希值。
- 按用户生成一个随机值。将此随机值作为给定用户属性的一部分存储在您的应用服务器上。
验证来自您服务器的响应数据
在审查您的应用服务器发送给您的应用的响应数据时,请确保许可验证库响应未被伪造。通过将其与您的应用在前一步中从 Google Play 接收到的密钥进行比较,验证应用服务器响应数据中包含的签名。
同样值得记住的是,只有特定于许可验证库(LVL)的块是已签名的。因此,它是您的应用服务器响应数据中您的应用应该信任的唯一部分。