2010-10-22 108 views
12

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

这是我的第一击:

cookie = user_id|expiry_date|HMAC(user_id|expiry_date, 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地址配合使用,并且不会使用会话?

NOTES

最新的材料我已阅读:
该做什么和客户机认证的注意事项在Web 又名福等人的。
https://pdos.csail.mit.edu/papers/webauth:sec10.pdf

安全cookie协议 又名Liu等人。
http://www.cse.msu.edu/~alexliu/publications/Cookie/cookie.pdf
,其扩展了先前的方法

硬化无状态会话曲奇
http://www.lightbluetouchpaper.org/2008/05/16/hardened-stateless-session-cookies/
,其还扩展对以前的方法。

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

+0

这是一个很好的问题,我想知道你是否会考虑开始赏金来恢复问题并让它受到更多的关注。也许甚至可以通过电子邮件将问题链接发送给各种安全专家。 – 2013-02-11 14:02:20

+1

您可能会从http://security.stackexchange.com/获得更多答案。 – Edu 2013-02-11 14:16:51

+0

好主意。 http://security.stackexchange.com/questions/30707/demystifying-web-authentication-stateless-session-cookies – Joony 2013-02-11 14:27:52

回答

7

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

小建议:

  • 将在大干快上更改密码(也许密码生成柜台,甚至只是随机盐)更新了用户数据的领域,包括标记,即场和签署部分。然后,当用户更改密码时,他们也会使任何其他被盗取的令牌无效。如果没有这个,你只能限制在合理的时间内允许令牌在到期前居住多久。(a)你可以有不同类型的令牌用于不同的目的(例如一个用于授权,一个用于XSRF保护),(b)你可以为不同目的使用不同类型的令牌使用新版本更新机制,而不必使所有旧令牌失效。

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

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

  • 双HMAC似乎并不能真正帮到你。根据当前的理解,针对HMAC-SHA256的强力和密码分析已经难以置信。

0
  1. 除非您的交易/秒将税收你的硬件,我只能通过在cookie中的散列(即离开了USER_ID和EXPIRY_DATE - 无感给坏人任何比你了解更多信息绝对不得不)。

  2. 考虑到以前的动态IP地址(我没有具体的细节,唉),您可以对下一个动态IP地址应该是什么做出一些假设。仅对动态IP地址的不变部分进行散列将有助于验证用户,即使他们的IP地址发生更改。考虑到各种IP地址分配方案,这可能会也可能不会。

  3. 你可以得到有关系统和散列的信息,在Linux中,你可以使用uname -a(但也有类似的功能可用于其他操作系统)。足够的系统信息,并且您可能完全跳过使用(部分)IP地址。这项技术将需要一些实验。仅使用通常由浏览器提供的系统信息将使其更容易。

  4. 你需要考虑你的cookies应该保持多久。如果您可以与需要每天进行一次身份验证的人一起生活,那么您的系统身份验证编码会比每月仅允许一次身份验证(以此类推)更容易。

+0

这个系统的重点是不在服务器上存储状态。如果可能的话,随机会话ID总是比这个系统更可取。 – ayke 2015-01-28 20:39:36

-1

我会认为这个协议非常弱!

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

服务器密钥SK是这里最脆弱的部分。 如果任何人都可以猜出它或窃取它,他可以作为特定用户登录。

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

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

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

看一看digest-authentication。 这是rfc2617指定的每个请求认证。 对每个请求发送的使用随机数的偿还攻击都是安全的。 使用散列法进行窃听是安全的。 它被集成在HTTP中。

+1

1)完全不相关。 2)不涉及不对称密码学,只有两个或四个哈希。 3)这就是密码学的重点,使得系统依赖于密钥的安全性而不是协议的安全性。 “有人只需要破解256位”是荒谬的。这大概是2^256次尝试。祝你好运。 – ayke 2015-01-28 20:36:43