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

标签 java php jakarta-ee nonce

很难说出这里问的是什么。这个问题是模棱两可的、模糊的、不完整的、过于宽泛的或修辞的,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开它,visit the help center .




9年前关闭。




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

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

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

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

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

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

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

    最佳答案

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

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

    关于java - 使用 nonce 进行无状态 cookie 身份验证的最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15041552/

    相关文章:

    spring - 正确使用子类化 spring ContextLoader 进行测试

    java - 错误CEE9001从Java调用外部存储过程(RPGLE/AS400)

    java - 为什么java streams跳过方法强制执行其他操作

    php - 如果不同行中的两列具有相同的值,则分组依据?

    php - 如果 Jquery 变量等于 div 的类,则将显示设置为阻止

    java - 在 jersey 项目中包含 jersey-bom import scoped 依赖项的目的是什么?

    java - 我有机会运行用户定义的程序来生成资源吗?

    java - Google Guava 缓存默认过期

    php password_hash 和 password_verify 问题不匹配

    java - 使用 DATE 输入调用 Oracle 存储过程不会设置 HH :MM:SS