在BillingService模块中,需要修改哪些内容才能提高安全性?

时间:2012-01-09 14:07:41

标签: android google-play in-app-billing

班级BillingService的评论建议:

  

您应该在使用之前修改和混淆此代码。

好的,但必须修改哪些

班级名称? TAG用于记录?方法名称和数据成员?逻辑和程序流程本身?其他

换句话说,我可以理解混淆的必要性,但是我如何能够实现推荐而无需从头开始重写所有内容(可能存在比不修改任何内容更糟糕的错误)?

3 个答案:

答案 0 :(得分:7)

我现在正在研究这个问题,到目前为止,我的方法如下:

  1. 我正在使用BillingReceiver,Billing Service,PurchaseObserver和ResponseHandler。
  2. 我已将所有Constants移动到我自己的Constants类中,所有上述类都包含在我自己的包中。
  3. 我已经取消了PurchaseDatabase类,并将其部分集成到我自己的SQLite数据库,DBAdapter和数据访问类中。
  4. 我已将CatalogEntry更改为我自己的模型对象,我的UI将与示例完全不同,例如RadioButton组而不是Spinner的产品项目(我只有4个)。
  5. 它在Security类中说'为了安全实现,所有这些代码都应该在与应用程序通信的服务器上实现'。我很幸运,我的应用程序必须联系我的服务器,所以我将在服务器上实现这些安全措施,我将自己验证传递给服务器的购买信息。我希望使用SSL保护这部分通信,我已经需要一个存储在我服务器上的先前用户名/密码(哈希和盐渍)。
  6. 我正在删除任何其他我不使用的多余代码,例如有效载荷编辑。
  7. 某些方法在其签名中有5或6个参数,例如onPurchasestateChanged() - 我正在考虑将这些组合成一个包装器对象(但还没有这样做)。
  8. 我正在慢慢彻底地测试它,以便我了解正在发生的事情并遵循建议。我首先使用完整的样本来确保它工作并测试静态响应。然后我开始做自己的更改,同时仍然进行静态测试。我还在测试静态响应,我将按照消息流来理解正在进行的交换。一旦我对此感到满意,我将使用我自己的产品Id进行测试,并尝试在数据及其安全性方面让自己满意。
  9. 我认为developerPayload字符串也可以进行签名和加密,并在返回我的服务器时解密并检查其完整性。
  10. 最后,我将使用ProGuard对代码进行模糊处理,并遵循StackOverflow上提供的一些提示。
  11. 希望这有帮助。

答案 1 :(得分:3)

这里没有好消息:除了使用Proguard之外,你还需要改变一切。这包括合并类,拆分它们,将某些方法从一个模块移动到另一个模块,特别是加密存储在数据库中的购买信息,如PurchaseDatabase类的描述所示:

  

在存储任何信息之前,您应该使用混淆器   持久存储。混淆器应该使用特定的密钥   到设备和/或用户。否则攻击者可以复制数据库   充满有效的购买并将其分发给其他人。

原因是使用像AntiLVL这样的工具,很容易将您的反编译(混淆!)代码与原始样本进行比较,并从中扣除任何需要妥协的代码。不可能完全防止开裂,但你应该尽量使它变得困难。

答案 2 :(得分:0)

他们解释如下:

  

应用内结算示例应用程序是公开发布的,可以   任何人都可以下载,这意味着它相对容易   如果您使用样本,攻击者可以对您的应用程序进行反向工程   完全按照发布的代码。示例应用程序旨在   仅用作示例。如果您使用样品的任何部分   应用程序,您必须在发布或发布之前对其进行修改   生产应用程序的一部分。

     

特别是,攻击者会查找已知的入口点和出口点   在应用程序中,因此修改这些部分非常重要   您的代码与示例应用程序相同。

这意味着不要使用提供的代码,更改其中的一部分,以便黑客无法知道您使用的代码。

基本上,我认为它们并不代表billingService本身,而是您在应用程序中使用它的方式。