如果我将验证卸载到远程服务器,我认为该过程将类似于:
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。
第二个问题,如果我们的公钥是文字字符串,为什么重要?文档说,“你不想让黑客或恶意用户轻易用另一个密钥替换公钥。”我不清楚有人可以利用我的应用程序,即使他们可以编辑二进制文件以包含恶意公钥而无需重新签名应用程序。
第三个问题,我是否会在尝试验证远程服务器验证时遇到所有这些问题(例如,将公钥存储到应用程序中的远程服务器上)?
第四个问题,如果我想将此购买验证的结果存储在手机上,那么所有这些额外的安全性都是徒劳的(即,我不想在用户访问时验证未锁定内容的购买状态内容)?
答案 0 :(得分:10)
第一个问题,远程服务器是否有安全原因进行现时生成/检查?
是的,服务器应该生成nonce,并进行检查。作为一般规则,几乎所有与安全相关的事情都应该在服务器中完成。 随机数是“仅使用一次的数字”。所以,服务器的正确之处是:
第二个问题,如果我们的公钥是文字字符串,为什么重要?
如果您对应用程序执行安全检查,那么如果您在服务器上进行工作则完全无关紧要(如您所愿)。
如果您在应用程序中执行安全性,则可以通过黑客攻击来绕过安全性。一种技术是更改公钥,如果将其保存为单个字符串则更容易。
第三个问题,尝试从远程服务器验证验证时是否存在所有这些问题(例如,将公钥存储到应用程序中的远程服务器)?
不,你不会。没有人可以访问/更改服务器的代码。至少和应用程序中的“容易”一样。
第四个问题,如果我想将此购买验证的结果存储在手机上,那么所有这些额外的安全性都是徒劳的(即我不想每次都要验证解锁内容的购买状态用户访问内容)?
嗯,这取决于。
实施具有服务器的应用内购买的“最安全”方式意味着: