为啥远程服务器上的签名验证比设备上更安全?

Posted

技术标签:

【中文标题】为啥远程服务器上的签名验证比设备上更安全?【英文标题】:Why is signature verification on remote server more secure than on device?为什么远程服务器上的签名验证比设备上更安全? 【发布时间】:2012-02-06 09:45:45 【问题描述】:

应用内结算概览中的Security Controls 部分指示在远程服务器而不是在应用(在 android 设备上本地运行)中执行“签名验证”:

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

但是如果我在远程服务器上进行签名验证,只期望得到yes/notrue/false 的答案,这实际上不是更容易被攻击者拦截和修改吗?

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

我错过了什么?

更新:@alf 正确指出,如果服务器也负责交付购买的内容,并且在服务器上执行签名验证,那么即使攻击者破坏了应用程序,服务器也不会交付通过应用内计费购买的内容。这是微不足道的,很好理解。

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

【问题讨论】:

我还想知道在实现应用内计费以解锁功能时是否真的需要服务器签名检查。你的发现是什么? 【参考方案1】:

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

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

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

【讨论】:

有了这个所谓的"clever SSL certificate trickery" 似乎没有任何意义的验证,甚至在服务器上通过 SSL... 这没什么特别的——它只是 DNS 欺骗。这可以在受控的实验室环境中轻松完成,但在真正的互联网上却并非易事。特别是对于主要网站。【参考方案2】:

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

【讨论】:

但是在设备上检查 true/false 的代码也可能被泄露......我错过了什么?【参考方案3】:

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

【讨论】:

即使我在服务器上进行签名验证,攻击者也可以反编译应用程序,只需删除与服务器通信的部分即可得到验证结果。我会怎么做呢? 在这种情况下,攻击者将无法获得您的宝贵内容,这是服务器负责传递的。假设 Android Market 服务器受信任(哈!),您的服务器受信任,但您无法控制应用程序。 当然,在这种情况下你是对的。我忘了提到我说的是使用应用内计费来解锁功能,而不是提供内容。你能参考那个场景吗?暂时 +2。

以上是关于为啥远程服务器上的签名验证比设备上更安全?的主要内容,如果未能解决你的问题,请参考以下文章

WinSCP远程连接Linux服务器

微服务架构如何运作?

讨论一下为啥cgi出现的漏洞对web服务器的安全威胁最大

Chrome 远程调试 - “待验证”

SSH服务远程访问及控制(2.基于密钥的安全验证)

SSH服务远程访问及控制(1基于口令的安全验证)