如何让我的API私有但可以被移动应用程序使用?

时间:2012-11-20 17:30:09

标签: security api http rest private

这是我的要求:

  • 适用于任何移动应用程序开发

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

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

我使用的是Varnish,配置非常基本,效果很好

  • 不公开

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

我想到的解决方案:

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

有可能这样做吗?例如使用私钥/公钥这样的东西?

适合HTTP,Apache和Varnish。

3 个答案:

答案 0 :(得分:14)

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

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

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

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

答案 1 :(得分:3)

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

答案 2 :(得分:0)

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

我们也使用HMAC哈希。

对此HMAC的好读: http://www.thebuzzmedia.com/designing-a-secure-rest-api-without-oauth-authentication/