这是我的第一个bash:
cookie = user_id|expiry_date|HMAC(user_id|expiry_date,k)
其中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',$key); $cookie = $user_id . '|' . $expiry_time . '|' . $digest;
我可以看到它是安全Cookie协议中所述容易受到重播攻击,但应该能抵抗卷攻击和加密拼接.
问题:我在这里是否正确,还是有一个我错过的大量漏洞?有没有办法防范使用动态分配的IP地址并且不使用会话的重放攻击?
笔记
我读过的最新资料:
客户端认证在网络上的Dos和不要
aka Fu et al.
(http://cookies.lcs.mit.edu/pubs.html)
安全Cookie协议
aka Liu等人
(http://www.cse.msu.edu/~alexliu/publications/Cookie/cookie.pdf)
其扩展了以前的方法
硬化无状态会话Cookie
(http://www.lightbluetouchpaper.org/2008/05/16/hardened-stateless-session-cookies/)
这也扩展了以前的方法.
由于主题非常复杂,我只是从安全专家那里寻找具有现实世界的创建和破坏身份验证方案的经验的答案.
解决方法
次要建议:
>将更改密码(可能是密码生成计数器,甚至只是随机盐)更新的用户数据中的字段放在令牌和签名部分中.然后当用户更改密码时,他们也会使任何其他被盗的令牌无效.如果没有这个限制,你可以在合法允许令牌到期前生存多长时间.>将方案标识符放在令牌和签名部分中,以便(a)您可以为不同的目的使用不同类型的令牌(例如一个用于验证,另一个用于XSRF保护),以及(b)您可以使用一个新版本,而不必使所有旧的令牌无效.>确保不会重复使用user_id,以防止使用令牌来访问具有相同ID的其他资源.管道划分假设|不能出现在任何字段值中.这可能适用于您(可能是)处理的数值,但您可能需要一些更多涉及的格式,例如URL编码的名称/值对.>双HMAC似乎并没有真正让你感到很多.对HMAC-SHA256的强力和密码分析,目前的理解已经不可信了.