【问题标题】:Rest token authentication with HTTP header带有 HTTP 标头的 Rest 令牌身份验证
【发布时间】:2012-12-12 01:33:57
【问题描述】:

这是一个带有登录屏幕的现有系统,现在我将一些服务公开为 REST 服务。我为此 Rest(jersey) 服务构建了一个身份验证令牌登录系统。用户发送用户名-密码,然后服务器返回一个计算为的令牌;

sha1(username+password+currenttime(or any random number))

用户将使用此令牌登录应用程序以获取更多请求。服务器在数据库中保存一份带有时间戳和用户 ID 的令牌副本,如果时间戳有效,则登录该用户。

考虑到会用到HTTPS,几个问题;

在我的设计中看起来一切正常吗? (哈希的生成和我保存在数据库中的方式)在我看来,最薄弱的一点是我需要通过 POST 请求发送普通的用户名和密码,但由于它是 HTTPS,我想这不会是一个问题。

另一件事,对于第一个请求,因为它是一个现有系统,所以我的数据库中没有用户密码,但保留了它们的加盐哈希版本。我想给所有客户这个加盐算法来向我发送他们的密码哈希是不安全的,所以我比较哈希而不是密码。这有意义吗=

【问题讨论】:

  • 无需使用 SHA1、用户名和密码计算令牌。随机选择的数字也同样安全。

标签: java rest authentication token


【解决方案1】:

1/2- 我建议将用户名/密码发布到服务器,然后服务器可以在正文中返回令牌。对我来说最有意义:您实际上并没有在服务器上存储太多,所以 PUT 是错误的,并且查询参数根本没有意义。标头应该在请求之间保持一致,因此它们也没有意义。在实际使用令牌进行通信时,请随意使用查询参数或标头。没关系。

3- 我会选择一个稍长的散列算法(sha256?)

【讨论】:

  • tnx 当客户端稍后使用令牌发出请求时,例如更新他的帐户。我使用 PUT 但不使用 POST,可以吗?
  • PUT/POST 在安全方面并不重要,只是这些方法的语义不同。
  • 我使用 POST 在 HTTP Authoraztion Basic 标头中发送密码、用户名/密码并在正文中接收令牌。稍后客户端将在自定义标头中发布/放置令牌。对吗?
  • 不要使用标头交换用户名/密码信息。只是没有意义。
  • HTTP Authoraztion Basic 标头是否用于发送用户名密码?那么为什么它没有意义呢?
【解决方案2】:
  1. 我通常会在 HTTP 标头中传递令牌。

  2. 使用 POST 还是 PUT 无关紧要。

  3. 我建议帮助防止重放类型攻击的其他方法是在每个 POST 请求中包含一个随机数(不断增加的值)。然后,服务器将跟踪最后使用的 nonce,并阻止任何使用以前使用的 nonce 的请求执行。

【讨论】:

  • tnx,对于 1,使用 HTTP 授权基本标头有任何好处,或者任何标头都可以
  • 任何涉及 nonce 值的系统都需要一个不会随每个请求一起发送的共享密钥。这会使这个系统严重复杂化,而且这并不是真正必要的,因为在 HTTPS 上使用 nonce 时并没有那么有用。
  • @Spring - 任何标题都应该没问题。
  • @Tom - 同意,通过 HTTPS 可能没有必要,但很好奇为什么需要额外的共享密钥。似乎身份验证令牌就足够了(除非您想使用 HMAC 或类似“签名”数据的东西)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-09
  • 1970-01-01
  • 2018-11-24
  • 2018-03-25
  • 1970-01-01
  • 1970-01-01
  • 2020-08-21
相关资源
最近更新 更多