2012-01-09 61 views
5

在应用内结算概述Security Controls部指示在远程服务器上而不是在应用程序(在Android设备上本地运行的)执行一个“签名验证”:为什么远程服务器上的签名验证比设备上的签名验证更安全?

通过执行签名验证可以帮助检测已被篡改或被欺骗的响应 。您可以在您的应用程序中执行此签名验证步骤,即 ;然而, 如果你的应用程序连接到一个安全的远程服务器然后我们 建议您该 服务器上进行签名验证。

但是,如果我在远程服务器上执行签名验证,预计只有yes/notrue/false答案,是不是这其实更容易被攻击者截获并修改?

如果从远程服务器的答案是另一个签名,那么设备如何比这样做第一(市场)的签名更安全的本地验证第二签名?

我错过了什么?

更新: @alf正确地指出,如果该服务器还负责提供购买的内容和签名验证的服务器上执行,那么即使攻击者妥协的应用程序,服务器将无法实现购买的内容通过应用内结算。这是微不足道的,而且很好理解。

我没有原来提的是,我实际上指的是其中服务器不提供任何内容而只是验证签名,从而使应用程序可以决定是否解锁某些功能的情景。在这种情况下,远程服务器签名验证在应用程序内的优点是什么?

+0

我也想知道,如果在实现应用内付费时真正需要服务器签名检查才能解锁功能。你的发现是什么? – 2014-09-15 19:09:13

回答

3

这是不是更容易被攻击者拦截和修改?

如果您使用SSL与服务器进行通信,它们将无法拦截并更改回复。 SSL还会验证服务器的身份,因此您确定您正在与自己的服务器通话,而不是攻击者的通话。

至于为什么在服务器上执行签名验证,原文档注释的想法是,如果你这样做的客户端,你需要存储在应用程序中的公共密钥。攻击者可能会将密钥与自己交换,攻击者生成的签名将验证OK。您可以通过在服务器上进行验证来避免这种情况。但是,真实生成的破解工具(如AntiLVL)只会查找返回true/false的字节码,并将其修改为始终返回true

+0

而这个所谓的[“聪明的SSL证书欺骗”](http://techcrunch.com/2011/11/14/siri-cracked-open-theoretically-opening-it-up-to-other-devices-or -even-android /)似乎没有任何形式的验证,甚至没有通过SSL的服务器... – 2012-03-05 05:04:48

+0

没有什么特别的 - 这只是DNS欺骗。这可以在受控的实验室环境中轻松完成,但在真实的互联网上并不重要。尤其适用于各大网站。 – 2012-03-05 05:11:26

2

因为您可以控制服务器上的验证码。设备端的代码可能已被泄露。

+3

但是在设备上检查“true/false”的代码也可能被破坏......我错过了什么? – 2012-01-09 21:38:36

2

如果您没有在服务器上执行签名验证,攻击者将不会打扰您的设备。或者,如果他愿意,他可以下载你的应用,反编译它,然后删除验证。你会对更改的应用程序做什么?

+0

即使我在服务器上执行签名验证,攻击者也可以反编译应用程序,只是删除与服务器通信的部分以获取验证结果。我会对此做什么? – 2012-01-09 21:43:41

+2

在这种情况下,攻击者不会获得服务器负责提供的宝贵内容。假定Android Market服务器是可信的(ha!),您的服务器是可信的,但您无法控制应用程序。 – alf 2012-01-09 21:54:50

+0

在这种情况下,你是对的,当然。我忘了提及我在谈论使用应用内结算来解锁功能,而不是提供内容。你可以参考这种情况吗? +2现在。 – 2012-01-09 22:04:37