【问题标题】:Brute force a confirmation code?暴力破解确认码?
【发布时间】:2011-03-28 20:28:24
【问题描述】:

我有一个网站,如果用户要重置此帐户,则会通过电子邮件向他们发送确认码,但是,经过讨论后,这似乎是一个巨大的安全漏洞。我想制作一个我可以使用的小应用程序,并向我的老板展示该网站有多不安全。

基本上,代码的长度是 12 个字符,最后 4 个是固定的,它只使用十六进制字符 0-9 和 a-f

所以我的理论是,黑客是否知道用户名,他可以暴力破解确认码,使用户密码一文不值。

有人知道从哪里开始制作这样的程序吗?

我知道这是一个有代码的编程问题,但我觉得贴出来是有效的。如果没有,请引导我到 .net 编程论坛,在那里我可以回答我的问题。

【问题讨论】:

  • 只要让验证确认码的代码变慢即可。如果您只能输入 y 个验证码,然后您的 IP 被阻止 x 分钟,那么暴力破解需要很长时间。虽然电子邮件可能会被拦截,但我不确定它是否适合任何需要高安全性的东西。

标签: .net security passwords password-protection


【解决方案1】:

【讨论】:

  • 这么快的反应!谢谢,我现在要睡觉了,但我会在早上到办公室时阅读它们,也许只是演示其他人的程序以显示安全问题。
【解决方案2】:

这大约是 281 万亿个组合。暴力破解它们需要足够长的时间,不会成为您网站的问题。

即使如您所说,只有前 8 个字符(4 个字节)不同,这仍然是 40 亿个组合。假设每秒尝试 100 次,那么暴力破解大约需要 16 个月。我真诚地希望您的服务器管理员能够在一年多的时间内检测到此类攻击。

正如 Thomas 建议的那样,通过让代码在一周左右后超时来引入额外的安全性。

【讨论】:

  • 遗憾的是,由于某种原因,只有前 8 个是随机的,后 4 个是固定模式。
  • 相应地更新了我的答案。
【解决方案3】:

首先,如果确认代码是真正随机的,那么将有 1612 = 281474976710656 个可能的代码 — 每个代码出现的可能性相同。暴力破解可能需要相当长的时间。

无论如何,如果您想向您的老板展示这样的事情是如何被暴力破解的,您只需要一个循环来生成所有可能的代码并逐个尝试它们。下面是一个 C 语言示例:

int code[12];
for (int i=0; i<12; i++) code[i] = 0;
while (1) {
    for (int i=11; i>=0; i--) {
        code[i]++;
        if (code[i] < 16) break;
        else code[i] = 0;
    }
    for (int i=0; i<12; i++) printf("%x", code[i]);
    printf("\n");
}

【讨论】:

  • 如果只有前 8 个是随机的呢? 4,294,967,296 可能?
  • @Landmine:是的,假设其余的不仅是非随机的,而且实际上是固定的(或者至少很容易从其他一些已知数据如用户名本身推导出来)。
  • @Landmine:给出可能值的计数,n。然后平均暴力时间是尝试每种可能性的时间的一半。假设您可以每秒执行r,那么平均时间(以年为单位)为n/(r*60*60*24*365*2)。这适用于任何事情。 (别忘了多台电脑并行会增加r。)
【解决方案4】:

我知道这可能不是一个可接受的答案,但这似乎相当安全,每个字符有 16 个可能的位置。

16^12 = 2.81474977 × 1014

【讨论】:

    【解决方案5】:

    给定的代码长度有 281474976710655 种可能的组合。即使尝试一个代码需要 1 秒,但暴力破解也需要数年时间......

    如果你想尝试,你需要写这样的东西:

    for (Int64 i = 0; i < 281474976710655; i++) {
        string code = i.ToString ("X12");
    
        //write code here to attempt this code
    }
    

    【讨论】:

      【解决方案6】:

      在 [0-9a-f] 范围内有 12 个字符,有 281474976710656 个可能的确认码。假设黑客每秒可以进行 1000 次尝试(这不太可能),尝试所有可能性需要 281474976710 秒。这大约是 8925 年......我认为用户不会关心黑客是否会在 8925 年入侵他的帐户;)

      可以肯定的是,您可以将有效期与确认码相关联。使其仅在 24 小时、3 天或您想要的任何时间有效

      【讨论】:

      • 这是一个绝妙的主意,有人建议,但是,负责人认为在发生事件之前无需采取任何行动。
      • 请记住 - 给定代码在可用范围内的正态分布,实际上平均需要 4462.5 年才能暴力破解代码。简而言之 - 不会有“事件”:)
      • @Jamie,确实如此。这就是为什么我说“尝试所有可能性”,而不是“暴力破解代码”;)
      【解决方案7】:

      有 2^32 ≈ 40 亿个确认码,因此暴力破解平均需要 20 亿次尝试。如果只能在线尝试,那就足够了,前提是被攻击者可以尝试的确认码数量明显小于20亿。

      请注意,这需要对给定确认代码的尝试次数设置上限所有帐户的帐户重置总数。后者在某些情况下可能会出现问题,例如,如果一篇新闻文章(真假)宣布您的用户数据库已被入侵,并且每个人都急于更改密码。

      对于针对特定帐户的攻击者,需要注意的是,这会使任何可以在给定地址接收邮件的人控制您站点上的帐户。因此,不仅任何冒充电子邮件帐户的人,而且可以窥探电子邮件帐户的任何人都可以在您的站点上冒充该帐户。这不一定是问题,但它应该清楚地显示在您的安全模型中。

      【讨论】:

        【解决方案8】:

        我知道这是个老问题 - 但我刚刚发现了这个问题。

        另一种思考方式是,即使黑客暴力破解代码,您也会得到“结果”,即使用新的随机密码将新电子邮件发送给原始用户 - 所以黑客所做的只是重置用户的密码,这实际上对他们没有帮助!

        因此,组合代码的问题、暴力破解的尝试都是多余的。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-07-04
          • 1970-01-01
          • 2020-02-12
          相关资源
          最近更新 更多