Google提供convenient API在Android应用上实施“应用内购买”功能。
除了这些文档之外,还有dedicated chapter关于此系统的安全级别以及设计它的好方法。 网络上有很多关于此步骤的文章,从public key protection到remote server validation,但我真的不明白为什么所有这些技术都可以解决,因为主要问题是,代码黑客攻击
也许有一个更好的术语来解释它,但让我做一个快速的例子。我的申请的基本思想是,在某些时候,除非他购买了物品,否则用户无法继续进行。
类似的东西:
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
}
}
}
按照之前的指导原则,开发人员可以在购买过程中保护他的应用,让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
}
// ...
}
关于远程验证和代码混淆的所有好话都完全消失了。那么,当第一个问题出现在布尔值时,为什么要花几个小时试图实现它们?
我错过了什么吗?
答案 0 :(得分:2)
除非您的应用程序严重依赖于其在服务器中的功能 - 因为每个功能都保留在服务器上,并且应用程序只是调用这些服务器API的客户端工具,所以您无能为力。如果它确实是基于服务器的应用程序 - 您可以检查每个传入请求(例如,应用程序可以发送一次会话哈希),如果存在有效的事务并且已付款。如果没有,请拒绝该请求。
应用程序的代码在客户端的手机上运行。如果黑客获得对该代码的访问权限并可以自由修改它以覆盖任何计费验证 - 您无能为力。您应该确保他首先无法访问该源代码。