泰迪熊
该问题在某种程度上与以下链接的问题有关。但是,我需要在某些方面和一些其他信息上多一点清晰度。请参阅:REST Web服务身份验证令牌实现
背景:
- 我需要使用令牌为REST Web服务实现安全性
- 该Web服务旨在与Java客户端一起使用。因此,表单身份验证和凭据弹出窗口没有用。
- 我是REST安全和加密的新手
这是我到目前为止所了解的:
对于第一个请求:
- 用户建立https连接(或容器使用301确保https)
- 用户POST输入用户名和密码以登录服务
- 如果凭据有效,我们:
- 生成一个随机的临时令牌
- 将随机令牌存储在服务器上,将其映射到实际用户名
- 使用仅服务器已知的对称密钥对令牌进行加密
- 散列加密的令牌
- 将加密的令牌和哈希发送给客户端
对于后续请求:
- 客户端发送此加密的令牌和哈希组合(使用基本的用户名字段?)
- 我们确保加密的令牌不会被散列篡改,然后将其解密
- 我们在会话跟踪表中检查未过期条目的解密令牌,并获得实际的用户名(有效期由代码管理吗?)
- 如果找到用户名,则根据允许的角色,配置允许的操作
更多细节:
- 由于客户端是Java客户端,因此第一个请求可以是包含凭证的POST。但是,这看起来可能会在https建立之前公开凭据。因此,是否应该有一个到安全资源的虚拟GET,以便首先建立https?
- 假设以上要求是必需的,第二个请求是带有凭据的LoginAction POST。手动处理此请求(不使用容器的授权)。这是正确的吗?
- 上面的LoginAction返回用户加密令牌+哈希的组合
- 用户将其设置为BASIC身份验证机制使用的标头(字段用户名)
- 我们实现了JAASRealm来解密和验证令牌,并找到允许的角色
- 其余的授权过程由带有在web.xml中定义的WebResourceCollection的容器完成。
这是正确的方法吗?
银光狐狸
为什么不将其简化为以下内容?
对于第一个请求:
- 用户建立与服务器的HTTPS连接(服务不会在任何其他端口上侦听),并建立POST凭据以登录服务。
- 服务器使用HSTS标头进行回复,以确保所有进一步的通信都是HTTPS。
- 如果凭据有效,我们:
- 生成使用CSPRNG安全生成的随机临时令牌。使其足够长以确保安全(128位)。
- 将随机令牌存储在服务器上,将其映射到实际用户名。
- 发送随机令牌给客户端
对于后续请求:
- 客户端通过HTTPS在自定义HTTP标头中发送令牌。
- 令牌位于数据库中并映射到用户名。如果找到,则根据允许的角色和允许的操作配置访问权限。
- 如果未找到,则认为用户未经身份验证,必须再次使用登录服务进行身份验证才能获取新令牌。
在服务器端,令牌将与到期日期一起存储。每次访问该服务时,此日期都会被更新以创建滑动到期日。将有每隔几分钟运行的作业删除过期的令牌,并且检查令牌的有效会话的查询将仅检查那些未视为已过期的令牌(如果计划的作业由于任何原因失败,则将阻止永久会话) )。
无需对数据库中的令牌进行散列和加密-除了通过隐晦性带来的安全感外,它没有增加任何实际价值。但是,您可以仅进行哈希处理。这将防止设法获取会话数据表的攻击者劫持现有的用户会话。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
编辑于
我来说两句