在设备上存储应用内商品数据

时间:2014-06-06 19:07:44

标签: android encryption in-app-purchase

我想在我的应用程序中添加应用内购买功能,我想知道存储产品可用数量的推荐方法(例如100个硬币)。

具有root访问权限的用户可以:

  • 访问/操作应用程序商店的未加密数据(以便他可以更改 硬币数量)。
  • 保存加密(或混淆)的数据,然后将其替换以取回 当他有更多硬币的时候说

因此,即使使用加密,欺骗也相对容易。我的问题是:

  • 我应该继续加密吗? (值得努力吗?)
  • 用户滥用此功能是否常见?
  • 有更好的存储项目计数的方法吗?
  • 这是什么做法?

2 个答案:

答案 0 :(得分:4)

在本地存储您的游戏世界货币,让交易在没有网络连接的情况下在本地进行,但当用户重新连接到互联网时,请将本地硬币与服务器显示为已购买的内容进行核对。

基本上,当您拥有网络连接时,请从Google下载所有购买的应用内商品。检查您的库存,然后根据用户在离线时执行的操作消耗应减少的任何产品。执行此操作后,如果本地总数与服务器显示的内容(消费后)之间存在差异,则将其标记为潜在的黑客攻击。否则,你很好(一切都平衡)。

当使用像这样的消费类应用内产品时(听起来你正在尝试这样做),实际上并没有完全脱机的方式。您依赖Google的应用内结算服务,因此您必须不时检查其服务器以协调/刷新购买的广告资源。来自Google的in-app billing documentation

  

要记录购买消费,请发送consumePurchase方法   应用内结算服务并传入purchaseToken字符串值   标识要删除的购买。 purchaseToken是其中的一部分   谷歌在INAPP_PURCHASE_DATA字符串中返回的数据   成功购买请求后播放服务。在这个例子中,   您正在记录标识的产品的消耗量   令牌变量中的purchaseToken。

     

int response = mService.consumePurchase(3, getPackageName(), token);

     

警告:不要在主线程上调用consumePurchase方法。   调用此方法会触发可能阻止您的网络请求   主线程。相反,创建一个单独的线程并调用   来自该线程的consumePurchase方法。

     

您有责任控制和跟踪应用内商品的效果   被提供给用户。例如,如果用户在游戏中购买   货币,你应该用金额来更新玩家的库存   货币购买。

关于如何在离线时存储和管理库存,您提到的方式听起来不错。加密不会造成伤害,但只要您在合理的时间间隔与Google协调,加密就不会有任何损失。只有极少数人真正尝试利用应用。大多数用户都没有root用户,对于那些用户来说,大多数用户实际上并不知道如何实现这些漏洞。如果你仍然担心它,是的,继续加密。这应该足以让你的绝大多数用户保持诚实。

答案 1 :(得分:0)

即使您在离线时使用字符串加密密码并在本地存储,那些付出更多努力的人仍然可以对您的应用进行逆向工程并找出用于解密密码的字符串。模糊你的应用程序只是为了让黑客更努力地工作,但并非不可能。否则,黑客就根本不存在。