【问题标题】:Android in-app billing verificationAndroid 应用内结算验证
【发布时间】:2011-12-19 09:20:07
【问题描述】:

如果我将验证卸载到远程服务器,我认为该过程将类似于:

Android Market                  Application     Remote Server
       |--------IN_APP_NOTIFY------->|                |
       |                             |-----nonce----->|
       |                             |<----nonce------|
       |<-GET_PURCHASE_STATE_CHANGED-|                |
       |---PURCHASE_STATE_CHANGED--->|                |
       |                             |--verification->|
       |                             |<-verification--|

如果我理解正确的话,nonce 是为了减少重放攻击漏洞,而验证是为了减少欺骗漏洞。此外,文档建议卸载安全处理的原因是验证步骤需要访问我的公共 Android Market 发布者的密钥,而远程服务器的目标是防止所述密钥需要包含/计算在我的代码中。

第一个问题,远程服务器进行随机数生成/检查是否有安全原因?按下验证步骤正确完成,我们会从远程服务器上查明消息是否被欺骗。所以在我看来,nonce 只是用来检测有人转播 IN_APP_NOTIFY。

第二个问题,如果我们的公钥是文字字符串,为什么重要?文档说,“你不想让黑客或恶意用户很容易用另一个密钥替换公钥。”我不清楚有人如何利用我的应用程序,即使他们可以编辑二进制文件以包含恶意公钥,而无需退出应用程序。

第三个问题,我在尝试从远程服务器验证验证时会不会遇到所有这些相同的问题(例如,将公钥存储到应用程序中的远程服务器)?

第四个问题,如果我想在手机上存储此购买验证的结果(即,我不想在用户访问时验证解锁内容的购买状态),那么所有这些额外的安全性都是无效的内容)?

【问题讨论】:

  • 嗨,我在开始应用内结算后遇到了所有相同的问题。我认为您提出的图表是正确的(据我现在了解)。自 12 月以来,您是否获得了任何其他见解?

标签: android security in-app-purchase


【解决方案1】:

第一个问题,远程服务器进行随机数生成/检查是否有安全原因?

是的,服务器应该生成随机数并进行检查。作为一般规则,所有与安全相关的事情几乎都应该在服务器中完成。 随机数是“仅使用一次的数字”。所以,服务器的正确做法是:

  1. 生成并保存一个随机数。
  2. 收到答复。
    • 如果答案包含已保存的随机数,请检查签名并进行处理。擦除随机数。
    • 如果答案包含未保存的随机数,则很可能是捏造/复制的随机数,因此请丢弃。

第二个问题,如果我们的公钥是文字字符串,为什么重要?

如果您对应用程序执行安全检查,则需要一点点,如果您在服务器上进行工作(您应该这样做),则完全无关紧要。

如果您在应用程序中执行安全性,那么应用程序可能会被黑客入侵以绕过安全性。一种技术是更改公钥,如果将其保存为单个字符串会更容易。

第三个问题,我在尝试从远程服务器验证验证时会不会遇到所有这些相同的问题(例如,将公钥存储到应用程序中的远程服务器)?

不,你不会。没有人可以访问/更改服务器的代码。至少在应用程序中尽可能“简单”。

第四个问题,如果我想在手机上存储此购买验证的结果(即我不想在任何时候验证解锁内容的购买状态),那么所有这些额外的安全性是否毫无意义用户访问内容)?

好吧,这取决于。

使用服务器实现应用内购买的“最安全”方式意味着:

  • 您将“可购买”内容保存在服务器中。如果用户购买了它,您将其下载到应用程序中,然后以某种难以“复制”到另一部手机的方式保存它。
  • 从服务器,仅当验证过程在服务器中正确完成时才发送内容。
  • 从应用程序中,如果您没有检测到“已保存”内容,请执行“恢复事务”操作,然后从服务器下载您需要的所有内容。
  • google play 的应用内购买并非旨在轻松提供内容,它旨在从集中式站点执行购买,因此对用户来说更容易。我们开发人员最终需要做大量工作才能使用它。

【讨论】:

  • 为第四个问题添加@atridas 积分是,如果您使用的是应用内结算版本 2 并且拥有非托管产品,您应该保留用户完成的所有购买记录,但如果您拥有托管产品,那么谷歌将负责此记录的维护,您可以直接在本地设备上进行购买,但出于安全原因,不建议这样做。
猜你喜欢
  • 2013-04-24
  • 1970-01-01
  • 2012-01-12
  • 2011-10-30
  • 1970-01-01
  • 1970-01-01
  • 2012-06-08
  • 2012-11-12
  • 1970-01-01
相关资源
最近更新 更多