使用nonce进行无状态cookie身份验证的最佳实践

时间:2013-02-23 14:25:46

标签: java php java-ee nonce

我一直在阅读有关使用cookie进行身份验证的信息。这似乎很有挑战性,因为cookie可能会从浏览器缓存中被盗或在HTTP消息中被截获。

我已经想到了使用nonce的想法。我喜欢它,因为有人偷了它,一旦真实用户再次尝试访问WebApp,他就会失去访问权限。为了不断窃取它,他必须要与用户保持密切联系。

但是我无法为它找到合适的算法。 Wordpress nonce实现使用user_id,它的身份验证cookie生成器有点复杂(我会继续阅读它,但我想要更简单的实现)。

这些是我被迫使用的限制因素:

  • 它不应该要求在DB或HD上写,因为它不值得那么复杂
  • 它不能使用Session,它必须是无状态的意思是服务器不能保存任何类型的数据,所有数据(登录和nonce)必须通过cookie发送给客户端,他必须发回该cookie数据
  • 可以在cookie中添加登录,例如“login | nonce”,因此当我收到cookie时,我可以将其子串以用于登录和nonce并验证它
  • 它必须在PHP和Java Servlet中实现!如果它使用其中任何一个的核心功能,我必须在另一个上实现该功能或找到替代品,但它们不需要是可互换的
  • 这是一个随机数,因此对于每个HTTP响应,我生成一个新的nonce,它只有一次有效,如果再次尝试再次无效
  • 如果一个nonce只能用于下一个请求会很好,但我认为这需要将这个nonce存储在某处并检索它以进行比较,我仍然认为打破无状态是不值得的,所以我认为时间限制可能就足够了(时间限制意味着使用time() / ( $nonce_life / 2 )作为nonce的参数之一,因此只能在此期间使用

我们的想法是建立一个无状态,仅限cookie的方式来了解谁登录。$ nonce_life可以是1天,因此用户在第一天访问时登录并保持登录直到白天结束。

正如我在Wordpress中看到的那样,实际上没有一种方法可以知道nonce只使用一次,所有验证都是在它的生命周期中使用它。因此,如果$ nonce_life是1天,那么Wordpress nonce可以在那天无限制地使用。我认为这有风险,也许最好将nonce存储在HD文件上,破坏Stateless,但确保nonce只使用一次。我可以用一个简单的rand()来创建它。

1 个答案:

答案 0 :(得分:2)

我终于理解了Wordpress _auth_cookie(),我错过了旧的PHP extract()explode()。它的cookie值保持$cookie = $user->user_login . '|' . $expiration . '|' . $hash;,$ hash包含很多信息,如登录,密码和到期时间。

正如我想要使用“login | nonce”,但它会增加它的到期时间。