0

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

我想到了为此使用 nonce 的想法。我喜欢它,因为有人偷了它,一旦真正的用户再次尝试访问 WebApp,他就会失去访问权限。为了继续窃取它,他必须离用户有点近。

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

这些是我被迫使用的约束:

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

这个想法是有一个无状态的、仅 cookie 的方式来知道谁登录了。$nonce_life 可以是 1 天,因此用户在第一天访问期间登录并保持登录状态直到一天结束。

正如我在 Wordpress 中看到的那样,实际上并没有办法知道 nonce 只使用一次,它所做的所有验证都是它是否在其生命周期内被使用。因此,如果 $nonce_life 是 1 天,则可以在该天无限使用 Wordpress 随机数。我认为这是有风险的,也许最好将 nonce 存储在 HD 文件上,打破无状态,但确保 nonce 只使用一次。我可以使用一个简单的 rand() 来创建它。

4

1 回答 1

2

我终于明白了 Wordpress _auth_cookie(),我错过了旧的 PHPextract()explode(). 它的 cookie 值保持不变$cookie = $user->user_login . '|' . $expiration . '|' . $hash;,$hash 包含很多信息,如登录名、密码和过期时间。

正如我想用“login|nonce”做的,但它增加了过期时间。

于 2013-02-23T20:49:03.013 回答