代码之家  ›  专栏  ›  技术社区  ›  Joony s3rro

解密Web身份验证

  •  12
  • Joony s3rro  · 技术社区  · 15 年前

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

    这是我的第一次狂欢:

    cookie = user_id|expiry_date|HMAC(user_id|expiry_date, k)
    

    在哪里? HMAC(user_id|expiry_date, sk) sk公司

    在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地址,而不使用会话?

    笔记

    我读过的最新资料:
    Web上客户端身份验证的注意事项
    ( https://pdos.csail.mit.edu/papers/webauth:sec10.pdf )

    一种安全的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/ )

    由于主题极其复杂,我只想从具有创建和破坏身份验证方案的实际经验的安全专家那里寻求答案。

    3 回复  |  直到 8 年前
        1
  •  7
  •   bobince    13 年前

    总的来说这很好,我在多个应用中做过类似的事情。它不比会话id更容易受到重播攻击。通过使用SSL,您可以保护令牌不被泄漏,以便重播,就像使用会话id一样。

    小建议:

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

    • 在token和signed部分放置一个scheme标识符,这样(a)您可以有不同用途的不同类型的token(例如一个用于auth,一个用于XSRF保护),并且(b)您可以使用新版本更新机制,而不必使所有旧的token失效。

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

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

    • 双倍的HMAC似乎并没有给你带来什么好处。根据目前的理解,针对HMAC-SHA256的暴力和密码分析已经难以置信地困难。

        2
  •  0
  •   Mark Leighton Fisher    13 年前
    1. 除非你的事务/秒会对你的硬件征税,否则我只会在cookie中传递一个散列值(即忽略用户id和到期日期——没有必要给坏人提供比你绝对需要的更多的信息)。

    2. 考虑到之前的动态IP地址,您可以对下一个动态IP地址应该是什么做一些假设(唉,我手头没有详细信息)。仅对动态IP地址的不变部分进行哈希运算将有助于验证用户,即使他们的IP地址发生更改。考虑到IP地址分配方案的多样性,这可能起作用,也可能不起作用。

    3. uname -a (但其他操作系统也有类似的功能)。足够的系统信息,您可能可以完全跳过使用(部分)IP地址。这项技术需要一些实验。只使用通常由浏览器提供的系统信息会更容易。

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

        3
  •  -1
  •   El Hocko    13 年前

    我认为这个协议很弱!

    1. 会话cookie不是具有高熵的随机源。
    2. 服务器必须在每个页面上执行非对称加密以验证用户。
    3. 任何用户的安全性只依赖于服务器密钥sk的安全性。

    服务器密钥SK是这里最脆弱的部分。 如果有人能猜到或偷到它,他可以作为一个特定的用户登录。

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

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

    如果所有用户的sk都是相同的,那么只要有人破解256位,他就可以随心所欲地登录。他只要猜出身份证和出境日期就行了。

    看一看 digest-authentication . 这是一个按请求的身份验证,由rfc2617指定。 它是安全的,可以在每次请求时使用nonce进行偿还攻击。 它是安全的窃听使用哈希。 它集成在HTTP中。

    推荐文章