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

泰迪熊

该问题在某种程度上与以下链接的问题有关。但是,我需要在某些方面和一些其他信息上多一点清晰度。请参阅:REST Web服务身份验证令牌实现

背景:

  • 我需要使用令牌为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. 如果未找到,则认为用户未经身份验证,必须再次使用登录服务进行身份验证才能获取新令牌。

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

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章