如何保护Google In-App Billing v3免受代码黑客攻击?

The*_*ted 9 security android in-app-billing

Google提供了一个方便的API,可以在Android应用上实现"应用内购买"功能.

除了这些文档之外,还有一个专门的章节,介绍了该系统的安全级别以及设计它的好方法.网络上有很多关于这一步的文章,从公钥保护远程服务器验证,但我真的不明白为什么所有这些技术都应该工作,主要问题是,代码黑客攻击.

也许有一个更好的术语来解释它,但让我做一个快速的例子.我的申请的基本思想是,在某些时候,除非他购买了物品,否则用户无法继续进行.

就像是:

public void accessTheVeryCoolFeature() {

    boolean haveIt = checkIfPurchased("verycoolfeature");
    if (haveIt) {
        // YEAH! let's open this very cool feature I paid 200 bucks for
    }
    else {
        // ok... where is my wallet?
        boolean purchased = startPurchaseFlow("verycoolfeature");
        if (purchased) {
            // my wallet is now empty but happy
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

遵循先前的准则,开发人员可以在购买过程中保护他的应用程序,让该startPurchaseFlow方法查询验证收据的远程可信服务器.应该避免使用"假市场"进行的购买.

另一种方法是通过混淆代码来保护未锁定的内容.使用像ProGuard这样的工具非常简单,并且应该让"黑客"的生活更加艰难.

现在,我试图扮演一个想要阅读我的代码的黑客,特别是计费阶段.我花了1分钟来发现我在前面的例子中写的代码.现在最好的部分:如果我编辑(混淆)源代码来执行此操作该怎么办?

public void atvf() {

    boolean hi = cip("verycoolfeature");
    hi = true; // <------------------------ AHAH!
    if (hi) {
        // YEAH! let's open this very cool feature for free
    }
    // ...
}
Run Code Online (Sandbox Code Playgroud)

所有关于远程验证和代码混淆的好话都完全消失了.那么,当第一个问题出现在布尔值时,为什么要花几个小时试图实现它们呢?

我错过了什么吗?

Dzh*_*eyt 2

除非您的应用程序严重依赖于服务器中的功能 - 因为每个功能都位于服务器上,并且应用程序只是调用这些服务器 API 的客户端工具,否则您无能为力。如果它确实是基于服务器的应用程序 - 您可以检查每个传入请求(例如,应用程序可以发送一次性会话哈希)是否存在有效交易并已付款。如果不是,则拒绝该请求。

该应用程序的代码在客户端的手机上运行。如果黑客获得了该代码的访问权限,并且可以随意修改它以覆盖任何计费验证,那么您将无能为力。您应该首先确保他无法访问该源代码。