应用内结算概述中的Security Controls部分指示在远程服务器而非应用中执行“签名验证”(在Android设备上本地运行):
通过执行签名验证,您可以帮助检测响应 被篡改或被欺骗的人。您可以 在您的申请中执行此签名验证步骤;然而, 如果您的应用程序连接到安全的远程服务器,那么我们 建议您对其执行签名验证 服务器
但是,如果我在远程服务器上执行签名验证,只期望yes/no
或true/false
答案,攻击者实际上是否更容易拦截和修改?
如果来自远程服务器的答案是另一个签名,那么如何在设备上本地验证第二个签名比第一个(市场)签名更安全?
我错过了什么?
更新: @alf正确地指出,如果服务器还负责提供购买的内容并且在服务器上执行签名验证,那么即使攻击者破坏了应用程序,服务器也不会提供通过应用内结算方式购买的内容。这是微不足道的,也很好理解。
我最初没有提到的是,我实际上指的是服务器不提供任何内容的情况,而只是验证签名,以便应用程序可以决定是否< strong>解锁某些功能。在这种情况下,远程服务器签名验证优于应用程序内的优势是什么?
答案 0 :(得分:3)
这实际上是不是更容易被攻击者拦截和修改?
如果您使用SSL与服务器通信,则无法拦截并更改回复。 SSL还会验证服务器的身份,因此您确定要与自己的服务器通信,而不是与攻击者通信。
至于为什么要在服务器上执行签名验证,原始文档评论的想法是,如果您在客户端上执行此操作,则需要将公钥存储在应用程序中。攻击者可能会将密钥与自己的密钥交换,攻击者生成的签名将验证是否正常。您可以通过在服务器上进行验证来避免这种情况。但是,AntiLVL等现实生活中的破解工具只会查找返回true/false
的字节码,并将其修改为始终返回true
。
答案 1 :(得分:2)
因为您可以控制服务器上的验证码。设备端的代码可能已被破坏。
答案 2 :(得分:2)
如果您不在服务器上执行签名验证,攻击者就不会打扰您的设备。或者,如果他愿意,他可以下载你的应用程序,反编译它,然后删除验证。你会对改变后的应用做些什么?