2017-09-14 118 views
1

Android在应用购买文档中说要验证服务器上的购买,而不是在设备上购买,因为否则攻击者可能会反编译该应用并自动验证购买。那么,如何在服务器上进行验证呢?我将用伪代码来说明。以下是设备验证方案1。为什么要在服务器上验证Play商店购买?

public boolean verify(data){ return Security.verifyPurchase(data); }

攻击者替换此:

public boolean verify(data){ return true; }

方案2,验证服务器上:

public boolean verify(data) { return verify("https://verify.server.com",data); }

攻击者使用此替代

public boolean verify(data){ return true; }

所以唯一的方法是,如果购买的产品也是从服务器提供的,对吧?如果它正在解锁某个功能,则必须从服务器上下载该功能所无法解决的问题,否则攻击者只能反编译并验证购买(或反编译并打开功能,跳过购买)。

+1

原因是因为您的伪代码并不完全是购买验证流程的工作原理。让我们暂时考虑用户名/密码认证 - 为什么黑客不会像在您的示例中那样将验证用户的代码更改为“true”?通常情况下,这是因为没有验证函数返回一个布尔值 - 通常服务器实际上是在验证后返回购买内容等数据。这些数据不会存储在设备上,黑客无法访问它。试试看这里作为一个例子:https://oauth.net/articles/authentication/ –

+0

那么这就是我说的 - 如果所有的服务器确实是验证购买,这是行不通的。服务器还必须返回客户需要的东西,以便将购买的商品提供给用户。如果您购买的产品不适合自己,那么您将不得不通过某种方式让它以这种方式工作。我只是确保我正确理解这一点,并且我不会错过任何东西。 – nasch

+0

我更新了我的评论。如果您不熟悉OAuth,请查看OAuth。它提供了如何工作的很好的细节。 –

回答

3

Play Store购买应该在单独的服务器上进行验证的原因是,“攻击者”可以相对容易地对您的apk进行反向工程,但是对于服务器而言(很可能)并非如此。

它也是在the documentation解释如何实现这一目标

验证服务器

上通过一个服务器上实现签名验证逻辑 ,你很难让攻击者进行反向工程师 您的APK文件。这保留了您的逻辑检查的签名的完整性。

要验证的购买细节值得信赖的服务器上,完成 以下步骤:

  • 确保设备服务器握手是安全的。
  • 检查返回的数据签名和orderId,并验证orderId是以前没有处理过的唯一值。
  • 确认您的应用程序密钥已经签名了您处理的INAPP_PURCHASE_DATA。
  • 使用Google Play Developer API中的ProductPurchase资源(适用于应用内商品)或SubscriptionPurchase资源(适用于 订阅)验证购买响应。这一步是 特别有用,因为攻击者无法创建对Play商店购买请求的 的模拟响应。

如果它的解锁功能,您将不得不从服务器下载东西的功能,不能没有

工作是的,没错,看further down

保护您的解锁内容

为防止恶意用户重新分发您未解锁的内容,请勿将其捆绑到您的APK 文件中。请执行以下操作之一:

  • 使用实时服务来传送您的内容,例如内容 供稿。通过实时服务传送内容可以让您的内容保持新鲜。
  • 使用远程服务器来传送您的内容。