验证该消息来自特定的应用程序/端点

时间:2012-12-18 19:14:17

标签: android security ssl cryptography drm

我正在尝试构建一个安全的系统,用于将数据从客户端Android应用程序传输到运行PHP的Web服务器。

我想要做的是确保系统在加密方面是安全的,以便来自应用程序的消息可以被验证为实际来自应用程序本身,而不是来自可能已经编写自定义的狡猾用户脚本或者可能使用cURL来游戏系统。

此类验证有许多用例,例如: -

  • 如果应用包含您从中收集指标的广告,您可能需要验证是否从应用发送了点击数据,而不是来自已经找到您的API并发送虚拟数据的恶意用户

  • 该应用可能会进行多项选择调查,您可能希望确保从应用中收集调查结果。

  • 该应用正在收集GPS追踪,您希望确保从应用本身发送数据。

在每种情况下,您都希望确保消息的来源是应用程序本身,而不仅仅是运行简单脚本来伪造数据的用户。

我考虑过的一些想法: -

  • SSL - 适用于保护频道和防止篡改(满足某些要求),但仍无法确保数据来源的完整性。

    < / LI>
  • 公钥加密 - 客户端应用可以使用私钥加密数据,然后将其传输到可以解码的服务器。问题是私钥需要在应用程序内进行硬编码 - 应用程序可以被反编译并提取私钥然后用于发送虚假数据。

  • 自制算法 - 一个非常类似的问题被问到here解决方案只能在“有人找出你的算法”之前工作 - 即不是很好溶液!

  • Hash chain - 这似乎是使用一次性密钥验证从客户端到服务器的每个数据负载的一种非常有趣的方式,但它又依赖于应用程序本身没有被反编译,因为密码仍然需要由应用程序存储。

我对密码学的有限了解使我认为理论上不可能构建一个完全可以这种方式验证的系统,因为如果我们不能信任最终客户或渠道,那么那里没有什么可以作为任何信任的基础...但也许有一些我忽略的东西!

1 个答案:

答案 0 :(得分:0)

这并不难,你只需要验证应用程序。您可以使用简单的用户和密码(通过SSL)或使用客户端身份验证来执行此操作。在这两种情况下,凭据都需要在应用程序中,攻击者可以提取它们并模拟应用程序。你必须离开它,并可能实施一些方法来缓解它。

您还可以通过使用非对称密钥(RSA等)或对称密钥(HMAC等)对消息进行签名来对消息进行身份验证。随机数有助于重放,有人捕获有效签名的邮件并一次又一次地将其发送到您的服务器。根据您的协议,使用一个协议的开销可能太大。

要保护凭据,您可以让客户端生成凭据并将其保存在系统KeyStore中,尽管公共API不完全支持,有关详细信息,请参阅here。当然,这需要一个额外的步骤,您需要将生成的凭据(例如,公钥)安全地发送到您的服务器,这可能很难正确实施。

无论您做什么,都不要尝试发明自己的加密算法或协议,使用已建立的加密算法或协议。