如何确保API请求来自我们的移动(iOS/Android)应用程序?

问题描述:

我们正在构建一个移动应用程序,并希望实施某种身份验证,以确保API仅被我们的应用程序访问。该应用程序的用户是匿名的,没有登录,但我确实通过设备ID标识它们以维护设置等。如何确保API请求来自我们的移动(iOS/Android)应用程序?

最简单的方法似乎是生成Guid/API密钥,我通过SSL发送每个请求。

让我担心的是有很多空闲时间的恶意人会下载应用程序,反编译它以获取API密钥和JSON请求,然后尽可能地垃圾我的数据库。

SSL,一个API密钥,一个设备ID和一个尽可能限制as-constrained-as-possible调用的API足够好吗?我应该采取不同的方法吗?我的恐惧是成立的还是毫无根据的?

不要在应用中嵌入单个API密钥。您的担忧对于恶意用户的影响是有效的。此外,您目前的设置中存在一个严重的漏洞,您可以通过提供伪造的UDID让恶意API用户更改其他用户的首选项。

取而代之的是,创建一个“注册”服务,在设备上首次启动应用程序时调用该服务,该设备根据UDID生成并返回一个GUID。将GUID存储在设备本地用户首选项和服务器上。跟踪您的服务器上的每个请求的GUID并将其与UDID进行匹配。

确保所有这些都通过SSL进行。

使用这种方法没有嵌入的主API密钥被滥用。此外,您可以通过标记GUID/UDID组合来将滥用用户列入黑名单,并且还可以消除现有注册设备潜在伪装问题。但是,您无法防止恶意注册尚未向您的服务注册的设备。这将永远是使用设备ID作为用户标识符的潜在危险。

还有更好,更成熟的认证机制采取更好的方法,即。 OAuth,JSessionIDs等,你应该看看。

另外,将来您不应该使用UDID来标识您的用户,因为它的访问权限已被弃用。您可以通过在应用程序安装时在设备上创建自定义设备GUID并将其保存在本地用户首选项中来达到您的目的模拟UDID。

+0

我不明白这是如何使任何更安全。脆弱点只在你的情况下有所不同:注册服务。我可以攻击,我也有完整的访问权限。我认为对于Android来说,至少也许可以这样做:http://android-developers.blogspot.de/2013/01/verifying-back-end-calls-from-android.html – therealmarv 2016-08-10 10:09:33

+0

你会如何攻击注册服务获得完全访问权限? – 2016-08-10 14:56:16