我目前正在研究我正在开发的网站的用户身份验证协议。我想创建一个身份验证 cookie,以便用户可以在页面之间保持登录状态。
这是我的第一个 bash:
cookie = user_id|expiry_date|HMAC(user_id|expiry_date, k)
其中kHMAC(user_id|expiry_date, sk)
和sk是只有服务器知道的 256 位密钥。HMAC 是一个 SHA-256 哈希。请注意,“|” 是一个分隔符,而不仅仅是串联。
这在 PHP 中看起来像这样(注意,这个问题与语言无关,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;
我可以看到它很容易受到A Secure Cookie Protocol中所述的重放攻击,但应该能够抵抗卷攻击和加密拼接。
问题: 我在这里是正确的,还是我错过了一个巨大的漏洞?有没有办法防御使用动态分配的 IP 地址且不使用会话的重放攻击?我不想在服务器端存储任何东西来完成这项工作。
另外,我没有计划或滚动我自己的。我问这个是为了更好地判断我应该选择什么解决方案。因此,没有某种解释就没有“仅使用 X 解决方案”的答案。
笔记
我读过的最新材料:
Web 上客户端身份验证的注意事项,
又名 Fu 等。
(https://pdos.csail.mit.edu/papers/webauth:sec10.pdf)
安全 Cookie 协议
,又名 Liu 等人。
( http://www.cse.msu.edu/~alexliu/publications/Cookie/cookie.pdf )
扩展了前一种方法
强化无状态会话 Cookie
( http://www.lightbluetouchpaper.org/2008/05/16/hardened-stateless-session-cookies/ )
,它也扩展了之前的方法。
由于这个主题非常复杂,我只是在寻找具有创建和破坏身份验证方案的实际经验的安全专家的答案。