当前位置: 首页 > 面试题库 >

使用令牌(Java)保护REST Web服务

卞坚成
2023-03-14
问题内容

该问题在某种程度上与以下链接的问题有关。但是,我需要在某些方面和一些其他信息上多一点清晰度。

  • 我需要使用令牌为REST Web服务实现安全性
  • 该Web服务旨在与Java客户端一起使用。因此,表单身份验证和凭据弹出窗口没有用。
  • 我是REST安全和加密的新手

这是我到目前为止所了解的:

对于第一个请求:

  1. 用户建立https连接(或容器使用301确保https)
  2. 用户POST输入用户名和密码以登录服务
  3. 如果凭据有效,我们:
    • 生成随机临时令牌
    • 将随机令牌存储在服务器上,将其映射到实际用户名
    • 使用仅服务器已知的对称密钥对令牌进行加密
    • 散列加密的令牌
    • 将加密的令牌和哈希发送给客户端

对于后续请求:

  1. 客户端发送此加密的令牌和哈希组合(使用基本的用户名字段?)
  2. 我们确保加密的令牌不会被散列篡改,然后将其解密
  3. 我们在会话跟踪表中检查未过期条目的解密令牌,并获取实际的用户名(有效期由代码管理吗?)
  4. 如果找到用户名,则根据允许的角色,配置允许的操作

更多细节:

  1. 由于客户端是Java客户端,因此第一个请求可以是包含凭据的POST。但是,这看起来可能会在https建立之前公开凭据。因此,是否应该对安全资源进行虚拟GET以便首先建立https?
  2. 假设上面是必需的,第二个请求是带有凭据的LoginAction POST。手动处理此请求(不使用容器的授权)。这是正确的吗?
  3. 上面的LoginAction返回用户加密令牌+哈希的组合
  4. 用户将其设置为BASIC身份验证机制使用的标头(字段用户名)
  5. 我们实现一个JAASRealm来解密和验证令牌,并找到允许的角色
  6. 其余的授权过程由带有在web.xml中定义的WebResourceCollection的容器负责。

这是正确的方法吗?


问题答案:

为什么不将其简化为以下内容?

对于第一个请求:

  1. 用户建立与服务器的HTTPS连接(服务不侦听其他端口),并通过POST凭据登录服务。
  2. 服务器使用HSTS标头进行回复,以确保所有进一步的通信都是HTTPS。
  3. 如果凭据有效,我们:
    • 生成使用CSPRNG安全生成的随机临时令牌。使其足够长以确保安全(128位)。
    • 将随机令牌存储在将其映射到实际用户名的服务器上。
    • 发送随机令牌给客户端

对于后续请求:

  1. 客户端通过HTTPS在自定义HTTP标头中发送令牌。
  2. 令牌位于数据库中并映射到用户名。如果找到,则根据允许的角色和允许的操作配置访问权限。
  3. 如果未找到,则认为用户未经身份验证,必须再次使用登录服务进行身份验证才能获取新令牌。

在服务器端,令牌将与到期日期一起存储。每次访问该服务时,此日期都会被更新以创建滑动到期日。将有每隔几分钟运行的作业删除过期的令牌,并且检查令牌的有效会话的查询将仅检查那些未视为已过期的令牌(以防止由于预定原因导致计划的作业失败的永久会话)。

无需对数据库中的令牌进行哈希处理 加密-
除了通过隐晦性带来的安全感外,它没有增加任何实际价值。您可以只是散列。这样可以防止设法获得会话数据表的攻击者劫持现有的用户会话。



 类似资料:
  • 这个问题在某种程度上与下面的链接问题有关。然而,我需要在某些方面更多的澄清和一些额外的信息。参考:REST Web服务身份验证令牌实现 背景: null null 对于后续请求: 客户端发送此加密令牌和哈希组合(使用基本的用户名字段?) 我们使用哈希确保加密的令牌没有被篡改,然后对其解密 我们检查会话跟踪表中解密的令牌是否有未过期的条目,并获得实际的用户名(过期由代码管理?) 如果找到用户名,则根

  • 我读到,当使用JWT时,不需要防止CSRF攻击,例如:“由于您不依赖cookie,您不需要防止跨站点请求”。 但是,有一点我不明白:如果我将令牌存储在localStorage中(正如我在同一网站的教程中被告知的那样),那么攻击者如何防止通过读取我的localStorage而不是Cookie来伪造恶意请求呢? 由于它是在服务器端生成的,我不知道如何在客户机请求中使用令牌而不将其存储在客户机的某个地方

  • 我们有一个简单的应用程序,只有两个消费者和5个endpoint。对于一个endpoint,我需要某种身份验证方式。我喜欢这样做的条纹方式,但我不知道我如何可以在spring Boot中构建这个。 “对API的身份验证是通过HTTP基本身份验证执行的。请提供API密钥作为基本身份验证用户名值。不需要提供密码。”

  • 我的问题是,对每个表单使用一个令牌,而不更新每个表单提交的令牌,安全吗?这能防止CSRF吗?

  • 我正在使用JWTs为我的应用程序验证用户身份。当用户登录时,他们将获得一个访问令牌和一个刷新令牌。为了保证刷新令牌的安全,我不将其存储在客户端,而是将其与他们的帐户一起保存在后端,这样就不容易访问了。虽然我对刷新令牌的安全性感到困惑,但当我阅读关于如何使用刷新令牌的在线资源时,以下是我理解的逻辑: 身份验证 将访问令牌+刷新令牌存储在某个位置(在我的示例中,访问令牌位于前端,刷新令牌位于后端) 执

  • 我已经创建了许多生成/使用JSON数据的Web服务,并使用OAuth2和承载令牌对它们进行了保护,效果很好。 然而,现在我需要构建一个类似的Web服务来生成图像而不是JSON(即JPEG/PNG数据)。为了保持一致性,我也想用OAuth2/承载令牌来保护服务,但是这样做会使服务在基于浏览器的应用程序中更具挑战性,这些应用程序希望使用 我认为有两种方法可以解决这个问题: > 修改OAuth2基础设施