9

这是我的要求:

  • 可用于我正在开发的任何移动应用程序

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

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

我正在使用具有非常基本配置的 Varnish,并且效果很好

  • 不公开

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

我想到的解决方案:

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

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

它非常适合 HTTP、Apache 和 Varnish。

4

3 回答 3

15

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

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

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

有关此主题的更多信息,请参阅iPhone 应用程序到网页的安全 https 加密

于 2012-11-20T17:39:20.110 回答
3

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

于 2014-10-13T16:42:08.957 回答
1

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

我们还使用 HMAC 哈希。

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

于 2014-10-13T16:49:03.387 回答