向您的应用添加服务器端许可证验证

验证用户是否已从 Google Play 商店购买或下载了您的应用的合法副本时,最好在您控制的服务器上执行许可证验证检查。

本指南介绍了完成服务器端许可证验证的分步过程,并介绍了一些与执行此检查相关的最佳实践。

流程概述

图 1 显示了信息如何在您的应用、Google Play 和您的私有服务器之间传输

Data flow diagram
图 1.您的应用和 Google Play 之间的数据流,然后是您的应用和您的私有服务器之间的数据流
  1. 您的应用向 Google Play 发出请求,询问特定用户是否已购买或下载了您的应用的合法副本。
  2. Google Play 通过向您的应用发送响应数据对象(类型为ResponseData的对象)来响应。此对象是一段签名的信息,说明用户是否已购买或下载了您的应用的合法副本。
  3. 您的应用向您控制的私有服务器发出请求,验证响应数据的内容。
  4. 服务器通过向您的应用发送状态来响应,指示用户是否确实已购买或下载了您的应用的合法副本。如果服务器提供“成功”消息,请验证响应,然后授予用户访问需要许可证的资源的权限。

由于响应数据已由 Google Play 签名,然后在您的服务器上进行检查,因此无法修改运行您的应用的设备上的对象。如果您的应用依赖于服务器,并且仅向合法用户提供资源,则您的应用将得到更有效的保护,防止未经授权的用户访问。

以下部分提供了执行服务器端许可证验证时需要牢记的其他注意事项。

防范重放攻击

收到 Google Play 关于用户许可证状态的响应后,用户可能会复制响应数据并多次使用它,或者将其提供给其他用户,然后这些用户可以伪造他们自己对您的应用私有服务器的请求。这种行为被称为重放攻击

为了降低用户成功执行重放攻击的可能性,请在向应用服务器发送请求之前采取以下措施

  • 检查响应数据中包含的时间戳,确保 Google Play 最近生成了该响应。

  • 对服务器请求执行速率限制,例如指数退避,以减少应用尝试向应用服务器发送相同响应数据的次数。

  • 在私有服务器上验证 Google Play 响应数据的内容之前,请向私有服务器发出基于身份验证的初始请求。在此第一个请求中,将用户凭据发送到您的服务器,然后让您的服务器响应一个nonce(或仅使用一次的数字)。然后,您可以将此 nonce 包含在您对私有服务器的下一个请求中,请求许可证验证数据。有关如何为 nonce 选择合适值的详细信息,请参阅生成合适的 nonce 值部分。

生成合适的 nonce 值

使用以下技术之一创建难以猜测的 nonce 值

  • 基于用户的 ID 生成哈希值。
  • 为每个用户生成一个随机值。将此随机值存储在应用服务器上,作为给定用户属性的一部分。

验证来自服务器的响应数据

当查看应用服务器发送到应用的响应数据时,请确保许可证验证库响应未被伪造。通过将应用服务器响应数据中包含的签名与应用在先前步骤中从 Google Play 收到的密钥进行比较,验证该签名。

还值得记住的是,特定于许可证验证库 (LVL) 的块是唯一签名的部分。因此,这是应用服务器响应数据中应用应该信任的唯一部分。