【问题标题】:How to make my API private but usable by mobile application?如何使我的 API 私有但可由移动应用程序使用?
【发布时间】:2012-11-08 20:20:23
【问题描述】:

这是我的要求:

  • 可供任何移动应用程序使用我正在开发

我正在开发移动应用程序,因此我可以实施任何安全策略。

  • 可使用经典 HTTP 缓存策略进行缓存

我正在使用带有非常基本配置的 Varnish,它运行良好

  • 不公开

我不希望人们能够使用我的 API

我想到的解决方案:

  • 使用 HTTPS,但它不涵盖最后的要求,因为来自应用程序的代理请求将显示使用的 API KEY。

有没有可能做到这一点?例如使用私钥/公钥之类的东西?

非常适合 HTTP、Apache 和 Varnish。

【问题讨论】:

  • 为什么人们一直认为这是可能的? SO上一定有1000多个这样的问题。我惊呆了。

标签: security api http rest private


【解决方案1】:

我们使用 HTTPS 并为授权用户分配一个密钥,该密钥在每个请求中发送并验证。

我们还使用 HMAC 哈希。

很好地阅读了这个 HMAC: http://www.thebuzzmedia.com/designing-a-secure-rest-api-without-oauth-authentication/

【讨论】:

    【解决方案2】:

    尽管这是真的,但基本上没有办法保证您的 API 仅由您的客户使用,除非您使用硬件安全元素来存储机密(这意味着您从头开始制作自己的手机,可以使用任何外部设备任何非官方客户端应用程序也可以)您可以做一些相当有效的事情来掩盖 API。首先,使用 HTTPS,这是给定的。但这里的关键是在您的应用程序中进行证书固定。证书锁定是一种技术,您可以在其中存储您尝试连接的 HTTPS 服务器的有效公钥证书。然后在每个连接上,验证它是 HTTPS 连接(不接受降级攻击),更重要的是,验证它是完全相同的证书。这样,您可以防止路径中的网络设备执行中间人攻击,从而确保没有人在您与服务器的对话中监听。通过这样做,并且对在应用程序中存储 API 参数的一般设计方式有点聪明(参见代码混淆,特别是如何混淆字符串常量),您可以相当确定您是唯一与您的服务器交谈的人。当然,安全性只是一个人想要闯入你的东西的程度的函数。这样做并不会阻止有经验的逆向工程师有时间尝试(并且可能成功)反编译您的源代码并找到它正在寻找的内容。但是这样做会迫使它查看二进制文件,这比仅仅执行中间攻击要困难几个数量级。这与最新的一连串泄露图像有关。存在用于 snapchat 的第三方客户端,它们是通过对 API 进行逆向工程创建的,通过嗅探器在中间人攻击期间查看流量。如果 snapchat 应用程序开发人员更聪明,他们会将他们的证书固定到他们的应用程序中,绝对保证他们正在与之交谈的是 snapchat 的服务器,并且黑客需要检查二进制文件,这是一项更加费力的任务,也许考虑到所涉及的努力,将不会执行。

    【讨论】:

    • 用换行符怎么样?
    【解决方案3】:

    无法确保网络链接的另一端是您的应用程序。这不是一个可以解决的问题。你可以用证书、密钥、秘密等混淆事物。但是所有这些都可以由最终用户进行逆向工程,因为他们可以访问应用程序。可以使用证书之类的一点混淆,但不能保证安全。您的服务器必须假定连接到它的任何人都是敌对的,并采取相应的行为。

    可以对用户进行身份验证,因为他们可以拥有帐户。因此,您当然可以确保只有有效用户才能使用您的服务。但是您不能确保他们只使用您的应用程序。如果您当前的架构需要,您必须重新设计。它无法解决,而且在常见的移动平台上肯定无法解决。

    如果您可以集成一块安全硬件,例如智能卡,则可以提高安全性,因为您可以更加确定另一端的人实际上是客户,但即使这样也不能保证您的应用程序是连接到服务器的应用程序,只有智能卡可供正在连接的应用程序使用。

    有关此主题的更多信息,请参阅Secure https encryption for iPhone app to webpage

    【讨论】:

      猜你喜欢
      • 2013-12-26
      • 2014-11-09
      • 1970-01-01
      • 2013-02-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多