保护 MY REST API 仅用于 MY IOS APP

Posted

技术标签:

【中文标题】保护 MY REST API 仅用于 MY IOS APP【英文标题】:Securing MY REST API for use with MY IOS APP only 【发布时间】:2014-12-16 12:22:07 【问题描述】:

我正在 Laravel 中设计一个 REST API 以与我的 ios 应用程序一起使用。目前我坚持以下几点:如何保护我的 REST API 以仅允许访问我的 ios 应用程序?

我已阅读有关 HTTP 基本身份验证、HMAC、oAuth2 的信息。

1) 基本身份验证需要 SSL,它要求您在每次 api 调用时发送用户名:密码。

但这不会阻止其他人使用来自其他应用程序的 API,假设他们将登录凭据发布到端点?

2) 我了解 HMAC 方法以及客户端和服务器如何知道公钥和私钥。私钥与请求和其他数据一起被加密。公钥在标头中发送。当服务器收到请求时,它会检测标头中的公钥并将其与数据库中的私钥相关联。然后它重新计算哈希并检查它是否匹配。所以,我有以下问题:

如果不通过网络发送私钥,新注册用户如何将私钥存储在 IOS 应用程序中? 这是否更适合将使用您的应用程序的应用程序?我通常会在 Instagram 和 Facebook 等 API 仪表板中看到这一点,他们会在其中为您提供应用密钥,对吗?

3) oAuth2 - 对我来说,这更像是允许人们使用另一个 API 登录我的应用程序。例如,允许用户使用 FB 登录我的应用程序并允许我的 API 使用 Facebook 数据?我现在真的不需要这样做。

我误解了吗?

听起来我需要通过向我的 IOS APP 授予我将其存储在我的 IOS APP 代码中的私钥来合并类似于 HMAC 方法的东西。当从 ios 应用程序中运行请求时,我会传递带有私钥和其他数据的哈希值,然后当服务器上收到请求时,我会通过重新计算哈希值来检测请求是否来自应用程序内的用户。我不知道这是否安全,我认为它不安全?

我缺乏什么知识?我现在很困惑,写这个问题是一场巨大的斗争。一旦事情变得更加清楚,我将对其进行修改。

【问题讨论】:

【参考方案1】:

1。 没错,这并不能阻止未经批准的客户。

2。 这并不是真正防止未经批准的客户端的方法,它更多的是验证消息没有通过网络被篡改。

3。 您正确理解 oAuth,它是关于验证客户端以特定方式使用您的 API 以及限制权限。

实际上不可能锁定您的 API,因此只有特定的客户端才能使用它,因为无法验证客户端的真实身份。此外,在客户端完成的任何形式的身份验证或验证最终都可以被逆向工程,然后可以作为“已批准”的客户端发送到服务器。

这样的事情可以用令牌来完成。服务器向客户端发送令牌,客户端对令牌执行一些已知的操作,例如加盐和散列,使用已知的盐和哈希操作,然后将令牌返回给prove,客户端是真实的。

问题是,如果有人对您的客户端进行逆向工程,他们可以确定该操作是什么,然后创建自己的客户端以相同的方式进行身份验证。任何形式的客户端身份验证都不是真正的安全性,也不可信。

另一种破坏方式是,如果有人可以 MiTM 您的请求。请求可以在到达服务器之前被捕获和修改,除了使用 SSL 之外没有任何方法可以防止这种情况发生,可以使用 SSLStrip 之类的东西来破坏。

任何阻止未经批准的客户的尝试基本上都是security through obscurity,因为没有可证明的安全方法来执行您的要求。

保护您的 API 的最佳方法不是限制哪些客户端可以访问它,而是确保它已经安全。最佳实践包括强制 SSL、只发送一次密码并从那时起使用令牌进行身份验证等。

【讨论】:

谢谢。看来我可以使用 SSL + 方法 2 来帮助防止 MITM。但是,是否有任何安全的方法可以在注册后将私钥从服务器一次获取到客户端?然后我可以将它存储在 IOS 设备上。另外,您对如何确保注册有任何想法吗?是什么阻止了某人向 /register 发送数千个帖子请求? @AlexLacayo 您要解决的问题是;您如何加密两个系统之间的连接而没有入侵者能够收听对话并加入。答案是public-key encryption。客户端和服务器之间的 SSL 连接实际上使用了这种类型的加密。不幸的是,它仍然容易受到 MITM 攻击,并且在客户端也可以破译。您可以将私钥硬编码到您的客户端中,但也可以进行逆向工程。

以上是关于保护 MY REST API 仅用于 MY IOS APP的主要内容,如果未能解决你的问题,请参考以下文章

GraphQL 与 REST API

用于保护 REST api 的 Apache Shiro

Hystrix 断路器实现在 Zuul API 网关级别或 REST API 服务级别

保护REST API以供Android客户端使用

如何通过查询身份验证保护 REST API

如何使用 REST + CodeceptJS 测试 API,访问受 Auth0 保护?