Android应用内结算验证

时间:2011-12-19 09:20:08

标签: android security in-app-purchase

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

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

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

第一个问题,是否存在远程服务器进行nonce生成/检查的安全原因?按下验证步骤正确完成,我们会从远程服务器中发现消息是否被欺骗。所以在我看来,nonce只是为了检测某人转播IN_APP_NOTIFY。

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

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

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

1 个答案:

答案 0 :(得分:10)

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

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

  1. 生成并保存一个随机数。
  2. 收到答复。
    • 如果答案包含已保存的随机数,请检查签名并进行处理。删除NONCE。
    • 如果答案包含未保存的nonce,则很可能是一个伪装/复制的,因此丢弃。
  3. 第二个问题,如果我们的公钥是文字字符串,为什么重要?

    如果您对应用程序执行安全检查,那么如果您在服务器上进行工作则完全无关紧要(如您所愿)。

    如果您在应用程序中执行安全性,则可以通过黑客攻击来绕过安全性。一种技术是更改公钥,如果将其保存为单个字符串则更容易。

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

    不,你不会。没有人可以访问/更改服务器的代码。至少和应用程序中的“容易”一样。

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

    嗯,这取决于。

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

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