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

时间:2010-10-22 19:16:45

标签: language-agnostic authentication cookies passwords security

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

这是我的第一个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', $user_id . '|' . $expiry_time, $key);
$cookie = $user_id . '|' . $expiry_time . '|' . $digest;

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

问题:我在这里排在正确的位置,还是有一个我错过的巨大漏洞?有没有办法防御使用动态分配的IP地址并且不使用会话的重播攻击?

注意

我读过的最新材料:
网络上客户端身份验证的注意事项 又名傅等人 (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/
这也扩展了以前的方法。

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

3 个答案:

答案 0 :(得分:7)

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

小建议:

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

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

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

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

  • 双HMAC似乎并没有给你带来太多帮助。目前的理解对HMAC-SHA256的强力和密码分析已经难以置信。

答案 1 :(得分:0)

  1. 除非你的交易/秒会对你的硬件征税,否则我只会在cookie中传递一个哈希值(即省略user_id和expiry_date - 没有意义给坏人提供的信息比你绝对要多)

  2. 考虑到之前的动态IP地址,我可以对下一个动态IP地址应该做出一些假设(我没有详细说明,唉)。仅散列动态IP地址的不变部分将有助于验证用户,即使他们的IP地址发生变化。考虑到各种IP地址分配方案,这可能有效,也可能无效。

  3. 您可以获得有关系统和哈希的信息 - 在Linux中,您可以uname -a(但是其他操作系统也有类似的功能)。足够的系统信息,您可以完全跳过使用(部分)IP地址。这种技术需要一些实验。仅使用正常浏览器提供的系统信息会使其更容易。

  4. 您需要考虑饼干保持新鲜的时间。如果您可以与每天必须进行一次身份验证的人一起生活,那么系统身份验证编码会比允许人们每月只进行一次身份验证(等等)更容易。

答案 2 :(得分:-1)

我认为这个协议非常弱!

  1. 您的会话cookie不是具有高熵的随机来源。
  2. 服务器必须在每个页面上进行非对称加密以验证用户。
  3. 任何用户的安全性仅依赖于服务器密钥sk的安全性。
  4. 服务器密钥SK是这里最容易受到攻击的部分。 如果有人可以猜到或偷走它,他可以作为特定用户登录。

    因此,如果为每个会话和用户生成sk,那么为什么要使用hmac? 我想你无论如何都会使用TLS,如果没有,请考虑你的协议因为重放攻击和一般的窃听而被破坏了!

    如果为每个用户生成sk,但不为每个会话生成sk,则它类似于256位密码。

    如果sk对所有用户都相同,那么有人只需要破解256位,他就可以按照他想要的任何用户登录。他只需要猜出身份证和截止日期。

    看看digest-authentication。 这是rfc2617指定的每请求身份验证。 使用随机数的报复攻击是安全的,每次请求都会发送。 使用散列进行窃听是安全的。 它集成在HTTP中。