2014-01-30 64 views
16

有没有什么方法可以将发送到我的REST API的请求仅限于来自我自己的移动应用程序二进制文件的请求?这个应用程序将分布在谷歌播放和苹果应用程序商店,所以它应该暗示有人将有权访问其二进制文件,并尝试对其进行反向工程。仅将API请求限制为仅限我自己的移动应用程序

我在想什么涉及应用程序签名,因为每个发布的应用程序都必须以某种方式进行签名,但我无法弄清楚如何以安全的方式进行签名。也许是获得应用程序签名,再加上基于时间的散列,再加上应用程序生成的密钥对以及虽然默默无闻的旧安全性的组合?

我在寻找尽可能不合格的东西。原因是因为我需要根据手机传感器收集的数据将数据传输到应用程序,如果人们可以将自己的应用程序构成并将数据发送给我的api,而这些数据不是由我自己的算法处理的,则它会打败它目的。

我接受任何有效的解决方案,无论多么复杂。锡箔帽子解决方案非常感谢。

+0

检查我的答案。我这样做,它很满意;) –

回答

11

存储在应用程序中的任何凭据都可以由用户公开。在Android的情况下,他们可以完全反编译你的应用程序,并轻松地检索它们。

如果与服务器的连接不使用SSL,则可以轻松地从网络中嗅探出它们。

说真的,任何想要凭证的人都会拿到他们,所以不要担心隐瞒他们。本质上,你有一个公共的API。

存在一些缺陷,需要额外的时间来管理公共API。

许多公共API仍然通过IP地址进行跟踪并实施tarpits来简化放慢似乎滥用系统的任何IP地址的请求。这样,来自同一IP地址的合法用户仍然可以继续,尽管速度较慢。

尽管您可能会与滥用者同时阻止无辜和正直的用户,但您必须愿意关闭IP地址或IP地址范围。如果你的申请是免费的,它可以给你更多的自由,因为没有预期的服务水平和合同,但你可能想要保护自己的法律协议。

一般来说,如果您的服务足够流行以至于有人想要攻击它,那通常是一个好兆头,所以不要太早担心它,但要确保它在前面。你不希望你的应用失败的原因是因为用户厌倦了在慢速服务器上等待。

您的其他选择是让用户注册,因此当您发现滥用情况时,您可以通过凭证而不是IP地址进行阻止。

6

不。您正在发布带有公共接口的服务,并且您的应用大概只能通过此REST API进行通信。您的应用可以发送的任何内容,其他任何人都可以发送。这意味着确保访问的唯一方法是以某种方式进行身份验证,即保密。但是,您也正在发布您的应用程序。这意味着你的应用程序中的任何秘密也基本上被发布出来。你不能两面都有;你不能指望既放弃你的秘密,并保守秘密。

1

没有什么可以做的。因为当你让一些人可以打电话给你的API。你可以做的最多的是如下:

因为你只想要你的应用程序(带有特定的包名称和签名)调用你的API,你可以实际得到apk的签名密钥,并发送到切断每一个API调用,如果那你确定你的请求响应。 (或者你可以有一个令牌API,你的应用程序会在应用程序的每一个开始时调用它,然后将该令牌用于其他API--尽管令牌必须在一段时间不工作后失效)

那么你需要编程代码,所以没有人看到你发送的内容以及你如何加密它们。如果你做了一个好的加密反编译将是如此难以做到。

即使apk的签名也可以用某些困难的方式来嘲弄,但是它可以做到最好。

+4

签名不是很难作弊,因为它是由客户端发送,客户端完全控制发送的内容。 Proguard并确保只从应用程序对API进行加密(SSL/TLS)调用(除了固定证书)可以通过默默无闻提供一些体面的安全性,直到他们解密源代码,关闭证书锁定并执行中间人攻击看看发送了什么。 –

0

正如其他答案和意见所暗示的那样,您无法真正将API访问权限限制在您的应用中,但您可以采取不同的措施来减少尝试次数。我相信最好的解决方案是使用像“App-Version-Key”这样的自定义头部向你的API(当然是本地代码)发出请求(这个密钥将在编译时决定),并让你的服务器检查这个密钥决定是否接受或拒绝。同样,当使用这种方法时,你应该使用HTTPS/SSL,因为这样可以减少人们通过查看网络请求来查看密钥的风险。

关于Cordova/Phonegap应用程序,我将创建一个插件来执行上述方法。完成后我会更新此评论。

相关问题