揭开网络身份验证的神秘面纱

Joo*_*ony 12 language-agnostic security authentication passwords cookies

我正在研究我正在开发的网站的用户身份验证协议.我想创建一个身份验证cookie,以便用户可以在页面之间保持登录状态.

这是我的第一个bash:

cookie = user_id|expiry_date|HMAC(user_id|expiry_date, k)
Run Code Online (Sandbox Code Playgroud)

其中k是,HMAC(user_id|expiry_date, sk)sk是仅为服务器所知的256位密钥.HMAC是SHA-256哈希.注意'|' 是一个分隔符,而不仅仅是连接.

在PHP中看起来像这样:

$key = hash_hmac('sha256', $user_id . '|' . $expiry_time, SECRET_KEY);
$digest = hash_hmac('sha256', $user_id . '|' . $expiry_time, $key);
$cookie = $user_id . '|' . $expiry_time . '|' . $digest;
Run Code Online (Sandbox Code Playgroud)

我可以看到它很容易受到安全Cookie协议中规定的重播攻击,但应该能够抵御卷攻击和加密拼接.

问题: 我在这里是否正确,或者是否存在我错过的巨大漏洞?有没有办法防御与动态分配的IP地址一起使用且不使用会话的重播攻击?

笔记

我读过的最新资料:
网上客户认证的注意事项, 也就是Fu等人.
(https://pdos.csail.mit.edu/papers/webauth:sec10.pdf)

安全Cookie协议 又名刘等人.
(http://www.cse.msu.edu/~alexliu/publications/Cookie/cookie.pdf)
扩展了以前的方法

强化无状态会话Cookie
(http://www.lightbluetouchpaper.org/2008/05/16/hardened-stateless-session-cookies/)
,它也扩展了以前的方法.

由于主题非常复杂,我只是在寻找具有创建和破坏身份验证方案的真实经验的安全专家的答案.

bob*_*nce 7

一般来说这很好,我在多个应用程序中做了类似的事情.与会话ID相比,它不再容易受到重放攻击.您可以使用SSL保护令牌免受泄漏重放,与会话ID相同.

小建议:

  • 在您的用户数据中放置一个字段,该字段在更改密码(可能是密码生成计数器,甚至只是随机盐)上更新,并在令牌和签名部分中包含该字段.然后,当用户更改其密码时,他们也会使任何其他被盗令牌无效.如果没有这个,你就可以在到期前合理地允许令牌存活多久.

  • 将方案标识符放在令牌和签名部分中,以便(a)您可以为不同目的使用不同类型的令牌(例如,一个用于auth,一个用于XSRF保护),以及(b)您可以使用新版本,无需使所有旧令牌无效.

  • 确保user_id永远不会重复使用,以防止使用令牌访问具有相同ID的其他资源.

  • 管道分隔假设|永远不会出现在任何字段值中.这可能适用于您(可能)处理的数值,但您可能在某些时候需要更复杂的格式,例如URL编码的名称/值对.

  • 双HMAC似乎并没有真正吸引你.目前的理解,对HMAC-SHA256的蛮力和密码分析已经令人难以置信.