如何保护我的 REST API?

信息安全 休息 验证 tls
2021-08-18 04:40:42

详细的问题是:

我正在构建一个 Android 应用程序,它在后端使用我的 REST API。我需要先构建一个注册和登录 API。用谷歌搜索了一段时间后,我觉得我只能采取两种方法。

  • 在注册期间,我使用https并获取用户的凭据;针对用户名(服务器端)将其保存在我的数据库中。在登录期间,我再次使用https,并询问用户的凭据;验证数据库上的散列密码并向他返回一个会话 ID,除非他注销,否则我打算永远不会过期。此外,用户进行的任何其他 API 调用 (GET/POST) 都将附带此会话 ID,以便我可以验证用户。

但是在上述方法中,我被迫对任何 API 调用使用https,否则我很容易受到Man in The Middle Attack 的攻击,即如果有人嗅探我的会话 ID,他可以重建类似的 GET/POST 请求,而我不会不想要。我对上述假设是否正确?

  • 第二个选项是遵循Amazon Web Services的路径,我使用公钥/私钥身份验证。当用户注册时,我使用https API 将他/她的凭据保存在数据库中。从那时起,我使用用户的散列密码作为私钥。用户进行的任何进一步的 API 调用都将使用用户的私钥获得请求 URL 的散列 blob。在服务器端,我使用保存的私钥重建哈希。如果哈希匹配,我让用户完成他的任务,否则拒绝。在这个选项中,我只需要为注册 API使用https 。REST 可以继续http

但这里的缺点是,我被迫将我的注册 API 托管在一个单独的虚拟目录中(我正在使用 IIS,我不确定我是否可以在同一个虚拟目录中托管 http 和 https API)。因此我不得不在一个单独的项目文件中开发注册 API。再次,我对上述假设是否正确?

编辑:我正在使用 ASP.NET MVC4 来构建 Web API。

我不愿意在我的所有 REST API 调用中使用https的原因是我觉得它不是轻量级的并且会创建更多的网络负载,这可能不适合移动应用程序。需要进一步的加密/解密和额外的握手可能会进一步影响手机的电池寿命?还是不重要?

您会建议以上两种方法中的哪一种?

PS:我们到处使用 Https,这是最好的决定。更多关于我的博客

4个回答

我会随处使用 SSL/TLS(因为你控制双方,强制 TLS 1.2 应该是可行的)。它使用起来相对简单,并且您可以免费获得许多安全功能。例如,如果您不使用 SSL,则需要担心重放攻击。

如果您担心性能,请确保服务器和客户端都支持会话恢复。这使得以后的握手便宜。由于与实际数据的加密相比,SSL 中的握手非常昂贵,因此这大大降低了整体负载。

如果您使用 HTTP 2,您甚至可以通过单个连接发送多个请求,这样您就可以避免后续请求的完整 TCP 和 SSL 握手开销。

我建议使用 OAuth。如果您不熟悉它,您绝对应该阅读它。另外,您可以使用第 3 方身份提供商,因此您的用户可以使用他们的 Google / Windows Live / 等帐户为您的应用程序,节省注册。

即使您想推出自己的身份验证框架,我也不建议使用非过期会话。会话应该在足够的空闲时间后过期,否则这会为利用提供更多空间(例如会话劫持)。

取决于它需要有多安全。每次您使解决方案变得更复杂时,您也可能会留下一个巨大的漏洞最好使用某种行业标准的授权和认证模块。

你可能会没事的,只要你是:

  • 加密密码(使用 AES 或 Blowfish 之类的东西)
  • 加盐密码
  • 通过 HTTPS 发送数据

另一种方法是 OAuth。

如果有人想黑到你够厉害,他们总能找到办法。秘诀是增加足够的时间和精力,以至于不值得有人这样做。因此,如果您没有大量的客户和/或财务数据,并且您不是一家知名公司,那么像上面这样的标准安全实施应该没问题。

在 JEE 中,我们有容器管理安全的概念。在这种情况下,我将我的 restful 服务设置为使用基本身份验证,默认情况下,它使用 HTTP 密码身​​份验证来针对应用服务器上设置的领域进行身份验证。这绕过了对 HTML 表单登录的需要,或部署客户端证书的复杂性。

应用程序只是假设会有一个用户主体,可能还有其他数据,例如随请求传递的标识详细信息。这包括 RESTful API。

在我的设置中,我实现了一个OAuth2 JASPIC 服务器身份验证模块[ Source ],它存储了对称加密的 OAuth 令牌,其中密钥驻留在服务器中,在cookie中也有有限的寿命,并将其用作应用程序的身份验证.

通过执行上述操作,我使应用程序远离身份验证语义,并且作为奖励,当我想使用 Selenium 执行功能集成测试时,我可以降级为使用 HTTP 密码,而不是一直连接到 OAuth 提供程序的复杂测试.

此外,我仍将使用 SSL 来确保至少您的传输是安全的。不使用 SSL 只会增加处理应用程序常见攻击的复杂性。

请注意,这是 JEE,但这些机制可以应用于任何技术。