java - 使用 token (Java) 保护 REST Web 服务

标签 java web-services security rest encryption

这个问题在某种程度上与下面链接的问题相关。但是,我需要在某些方面和一些附加信息上更清楚一点。引用: REST Web Service authentication token implementation

背景:

  • 我需要使用 token 为 REST Web 服务实现安全性
  • 网络服务旨在与 Java 客户端一起使用。因此,形式 凭据的身份验证和弹出窗口没有用。
  • 我不熟悉 REST 安全和加密

这是我目前的理解:

对于第一个请求:

  1. 用户建立 https 连接(或容器确保 https 使用 301)
  2. 用户将用户名和密码发布到登录服务
  3. 如果凭据有效,我们:
    • 生成一个随机的临时 token
    • 将随机 token 存储在服务器上,将其映射到实际用户名
    • 使用只有服务器知道的对称 key 加密 token
    • 散列加密 token
    • 将加密后的token和hash发送给客户端

对于后续请求:

  1. 客户端发送这个加密的 token 和哈希组合(使用 基本的用户名字段?)
  2. 我们使用哈希确保加密 token 未被篡改,并且 然后解密
  3. 我们检查 session 跟踪表中的解密 token 未过期的条目并获取实际的用户名(过期要管理 通过代码?)
  4. 如果找到用户名,则基于允许的角色、允许的操作 已配置

更多详情:

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

这是正确的做法吗?

最佳答案

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

对于第一个请求:

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

对于后续请求:

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

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

没有必要对数据库中的 token 进行散列加密——除了一点点security through obscurity之外,它没有增加任何实际值(value)。 .不过你可以散列一下。这将防止设法获取 session 数据表的攻击者劫持现有用户 session 。

关于java - 使用 token (Java) 保护 REST Web 服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24411228/

相关文章:

java - 在循环内声明一个变量更有效,还是仅仅重新分配它更有效?

java - EntityManager的@PersistenceContext注入(inject)

java - 如何检测Android软件键盘何时被隐藏?

Python Web 服务建议

java - 定期调用Java Web服务方法

security - 防止对 Web 应用程序的字典攻击

Java 7,尝试资源 : can i omit creating Connection and PreparedStatement?

在django spyne中进行多数据处理的xml

php - 这是什么类型的哈希/加密? '0E0B020601'

PHP 安全漏洞,用于对象实例化的未经验证的 Post 数据