Android 仅将API请求限制为我自己的移动应用程序

Android 仅将API请求限制为我自己的移动应用程序,android,ios,security,mobile,Android,Ios,Security,Mobile,有没有办法将对我的RESTAPI的post请求仅限于来自我自己的移动应用程序二进制文件的请求?该应用程序将在Google Play和Apple app Store上发布,因此应该暗示有人将访问其二进制文件并尝试对其进行反向工程 我在想一些关于应用程序签名的事情,因为每个发布的应用程序都必须以某种方式进行签名,但我不知道如何以安全的方式进行签名。也许是获得应用程序签名,加上基于时间的哈希,再加上应用程序生成的密钥对,再加上良好的旧安全性(尽管晦涩难懂)的组合 我在寻找尽可能防故障的产品。原因是因为

有没有办法将对我的RESTAPI的post请求仅限于来自我自己的移动应用程序二进制文件的请求?该应用程序将在Google Play和Apple app Store上发布,因此应该暗示有人将访问其二进制文件并尝试对其进行反向工程

我在想一些关于应用程序签名的事情,因为每个发布的应用程序都必须以某种方式进行签名,但我不知道如何以安全的方式进行签名。也许是获得应用程序签名,加上基于时间的哈希,再加上应用程序生成的密钥对,再加上良好的旧安全性(尽管晦涩难懂)的组合

我在寻找尽可能防故障的产品。原因是因为我需要根据手机传感器收集的数据向应用程序发送数据,如果人们可以冒充我自己的应用程序,并向我的api发送未经我自己算法处理的数据,这就违背了它的目的


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

否。您发布的服务具有公共界面,您的应用程序可能只能通过此REST API进行通信。您的应用程序可以发送的任何内容,其他任何人也可以发送。这意味着确保访问安全的唯一方法是以某种方式进行身份验证,即保密。但是,您也在发布应用程序。这意味着你的应用程序中的任何秘密基本上也被泄露了。你不能两全其美;你不能期望既透露你的秘密又保守秘密。

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

如果与服务器的连接不使用SSL,则可以很容易地从网络中嗅出它们

说真的,任何想要证书的人都会得到它们,所以不要担心隐藏它们。本质上,您有一个公共API

有一些陷阱,管理公共API需要额外的时间

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

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

一般来说,如果你的服务很受欢迎,以至于有人想攻击它,这通常是一个好迹象,所以不要过早地担心它,但一定要保持领先。你不希望你的应用程序失败的原因是因为用户厌倦了在一个缓慢的服务器上等待


您的另一个选择是让用户注册,这样当您发现滥用时,您可以通过凭据而不是IP地址进行阻止。

您无能为力。因为当你让某人进来时,他们可以调用你的API。您最多可以执行以下操作:

因为您只需要并且只有您的应用程序(具有特定的包名和签名)调用您的API,所以您可以实用地获取apk的签名密钥,并在每个API调用中发送is以进行服务,如果可以的话,您可以响应请求。(或者,您可以拥有一个令牌API,您的应用程序在应用程序的每个开头调用它,然后将该令牌用于其他API-但在几个小时不使用该令牌后,该令牌必须无效)

然后,您需要对代码进行保护,这样就不会有人看到您发送的内容以及您如何加密它们。如果你做的很好,加密反编译将很难做到


即使是apk的签名也可能会受到一些严厉的嘲弄,但这是你能做的最好的事情。

正如其他答案和评论所暗示的那样,你不能真正限制API访问仅限于你的应用程序,但你可以采取不同的措施来减少尝试。我认为最好的解决方案是使用自定义标题(如“App Version Key”(此密钥将在编译时确定)向API发出请求(当然是从本机代码),并让服务器检查此密钥,以决定是否接受或拒绝。此外,在使用此方法时,您应该使用HTTPS/SSL,因为这将减少人们通过查看网络上的请求而看到您的密钥的风险


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

虽然这是一篇老文章,但我认为我应该分享谷歌在这方面的更新

实际上,您可以确保您的Android应用程序正在使用调用API。这会在网络调用上增加一点开销,并防止应用程序在根设备中运行

我发现iOS上没有类似的SafetyNet。因此,在我的例子中,我首先在我的登录API中检查了设备配置,并对Android和iOS采取了不同的措施。对于iOS,我决定在服务器和应用程序之间保留一个共享密钥。由于iOS应用程序有点难以反向工程,我认为这种额外的密钥检查增加了一些保护

当然,在这两种情况下,您都需要通过HTTPS进行通信

是的,它是公共的 该应用程序将在Google Play和Apple app Store上发布,因此应该暗示有人将访问其二进制文件并尝试对其进行反向工程

从它出现在商店的那一刻起,它就是公开的,因此应用程序二进制文件上的任何敏感信息都必须被视为潜在的危害

访问API服务器的用户和用户之间的差异 在深入研究您的问题之前,我想首先澄清一个关于谁访问API服务器以及什么访问API服务器的误解。我写了一系列的文章