想要为 REST API 实现一个非常好的认证机制

信息安全 验证 饼干 休息 hmac
2021-09-01 03:16:14

我拥有一个 Web 应用程序(带有 Angular 的单页应用程序),它通过一组基于我的服务器端应用程序(使用 Play Framework 2.2.1)的 REST API 来请求一些数据。

所以基本上,我不是安全专家,所以我最初想使用一个“工具”来轻松实现身份验证。因此我选择使用SecureSocial

我根据自己的需要对其进行了定制,但在阅读了一些关于 REST 身份验证方案的文档后,我意识到我可能走错了路。

为什么?仅仅因为它基于会话令牌机制而不是完整的无状态解决方案。

简而言之,身份验证工作流程是:

  • 用户通过传统形式(电子邮件/密码)登录 Web 应用程序
  • 服务器检查凭据的有效性(比较密码的 BCrypt 哈希值),如果有效,则返回包含一种身份验证令牌的 cookie。此身份验证令牌也存储在服务器缓存中(Play 配置为访问 Memcached 存储),以便能够在用户每次请求受限(在可见性方面)功能时进行一些比较。

此解决方案的优点: ..this
适用于控制对RESTRICTED API 的访问。

缺点:

  • 此解决方案需要数据存储将身份验证令牌存储在服务器上,以便比较客户端在每次请求尝试时提供的身份验证令牌。目前,我使用 Memcached。
  • 无法限制对一小部分客户端的访问。事实上,如果我只想限制对我的应用程序的所有 REST API 访问怎么办?肯定需要一种 API 密钥/API 密钥来实现授权而不是简单的身份验证。
    例如,我绝对不想让外部命令行或外部网站访问 API,即使它们通过提供一些良好的凭据成功通过了身份验证步骤。
    最糟糕的是,他们可以毫无困难地访问一些最初公开的数据,这意味着无需身份验证,例如:获取一组精确数据的列表。
  • 如果无法确保 HTTPS 传输,似乎很容易受到某些已知攻击。

我听说并阅读了很多有关HTTP BASIC的信息,但似乎应该避免:http ://adrianotto.com/2013/02/why-http-basic-auth-is-bad/

然后我阅读了亚马逊实施的 HMAC 解决方案,这似乎是一个很好的解决方案;对于我想要的简单情况,OAuth1 听起来太复杂了。

我应该尝试实施 HMAC 解决方案吗?
HMAC 解决方案是否真的与浏览器兼容,这意味着允许用户调用多个不同的操作而无需每次都进行身份验证?
在这种情况下是否涉及代币交换来做这个把戏?

如果有人可以在处理 Web 应用程序/浏览器时向我介绍 HMAC 的概念,我将非常高兴。
事实上,我很难找到一些关于 HMAC 方案与浏览器相结合的文档。

或者,真的相信 Oauth 解决方案?...

我正在思考这个问题...

3个回答

不要滚动你自己的身份验证,Json Web Token (JWT) 可以做你想做的事,它比 oAuth 更简单并且使用 HMAC

当您有三方方案时,OAuth 很有用。这是当您有一个身份验证服务来确定客户端可以在资源服务上访问什么时。在这种情况下,客户端通过提供证明身份验证服务已授权用户执行操作的令牌来连接到资源。从它的声音来看,您并不真正需要 OAuth。

如果您正在使用服务器到服务器 API(即您的服务由另一台服务器访问,而不是由用户的浏览器直接访问),那么只要您的服务在 HTTPS 上运行(即没有未加密的 HTTP),HTTP Basic 就非常好。HMAC 不会真正使这种情况更安全。如果您必须通过未加密的 HTTP 运行您的服务,HMAC 可能会很有用,因为它至少可以防止 MITM 攻击者篡改,但考虑到现在设置 HTTPS 是多么容易,HMAC 比任何人都需要的要复杂得多。

如果您想要比 Basic 更好的安全性,您可以使用 Mutual TLS 身份验证(也称为 TLS 客户端身份验证)。Mutual TLS 比 Basic 更好,因为它使用非对称加密,这意味着客户端或服务器的妥协不会危及另一个密钥的安全性。在许多情况下,这种好处并不那么重要,但它可能适用于您的情况。

我知道这有点晚了,但看到它并认为我还是会回答。HMAC 是(键控的)散列消息验证码它保护 API 的方式如下:您创建一个 API 令牌,该令牌与消息相结合,然后进行哈希处理。然后将此 HMAC 与用户名和要调用的 API 调用一起发送到 API 服务器:

https://apiserver.com/api/?mac=098f6bcd4621d373cade4e832627b4f6&user=leaustinwile&command=url_encode({json:"test"}).

然后 API 后端获取消息并通过查找用户的 API 令牌使用 计算 HMAC 服务器端:

https://localhost/get_api_token/<user>

如果在服务器端计算的 HMAC 与随消息发送的 HMAC 匹配,则调用 API 调用,因为该消息已被验证为真实(来自您实例中的正确来源)。