这个问题在某种程度上与下面链接的问题相关。但是,我需要更清楚地了解某些方面和一些附加信息。参考:REST Web 服务身份验证令牌实施
背景:
- 我需要使用令牌实现 REST Web 服务的安全性
- Web 服务旨在与 Java 客户端一起使用。因此,形成
身份验证和凭据弹出窗口没有用。
- 我是 REST 安全和加密新手
这是我到目前为止所理解的:
对于第一个请求:
- 用户建立 https 连接(或容器确保 https 使用
第301章)
- 用户 POST 用户名和密码以登录服务
- If credentials are valid we:
- 生成随机临时令牌
- 将随机令牌存储在服务器上,将其映射到实际用户名
- 使用只有服务器知道的对称密钥来加密令牌
- 对加密令牌进行哈希处理
- 将加密的令牌和哈希值发送给客户端
对于后续请求:
- 客户端发送此加密令牌和哈希组合(使用
基本的用户名字段?)
- 我们使用散列确保加密令牌不被篡改
然后解密它
- 我们检查会话跟踪表中解密的令牌是否有
未过期条目并获取实际用户名(过期要管理
通过代码?)
- 如果找到用户名,则根据允许的角色、允许的操作
已配置
更多细节:
- 由于客户端是java客户端,第一个请求可以是POST
包含凭证。然而,这看起来可能会暴露
https 建立之前的凭据。因此应该
对安全资源有一个虚拟 GET,以便 https 是
首先成立?
- 假设上面是必需的,第二个请求是 LoginAction POST
与凭据。此请求是手动处理的(不使用
容器的授权)。这是正确的吗?
- 上面的LoginAction返回用户加密后的组合
令牌+哈希
- 用户将其设置为 BASIC 身份验证使用的标头
机制(字段用户名)
- 我们实现一个 JAASRealm 来解密和验证令牌,并发现
允许的角色
- 授权过程的其余部分由容器负责
与 web.xml 中定义的 WebResourceCollection
这是正确的方法吗?
为什么不将其简化为以下内容?
对于第一个请求:
- 用户与服务器建立 HTTPS 连接(服务不监听任何
其他端口)并将凭据发布到登录服务。
- 服务器回复HSTS 标头确保所有进一步的沟通
是 HTTPS。
- If credentials are valid we:
- 生成一个随机临时令牌,该令牌是使用CSPRNG。使其足够长以确保安全(128 位)。
- 将随机令牌存储在服务器上,将其映射到实际用户名。
- 将随机令牌发送给客户端
对于后续请求:
- 客户端通过 HTTPS 在自定义 HTTP 标头中发送令牌。
- 令牌位于数据库中并映射到用户名。如果发现访问权限,则根据允许的角色和允许的操作进行配置。
- 如果未找到,则用户被视为未经身份验证,并且必须再次通过登录服务进行身份验证才能获取新令牌。
在服务器端,令牌将被存储并带有到期日期。每次访问该服务时,该日期都会更新以创建滑动到期时间。将有一个作业每隔几分钟运行一次以删除过期的令牌,并且检查令牌是否有效会话的查询将仅检查那些尚未被视为已过期的令牌(以防止计划作业因任何原因失败时出现永久会话) )。
不需要哈希and加密数据库中的令牌 - 除了一点点之外,它没有增加任何实际价值通过默默无闻实现安全。不过你可以直接散列。这将防止设法获取会话数据表的攻击者劫持现有用户会话。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)