蛮力确认码?

时间:2010-08-12 10:11:06

标签: .net security passwords password-protection

我有一个网站,并且对于用户重置此帐户,确认代码是电子邮件给他们,但是,在讨论之后,似乎这可能是一个巨大的安全漏洞。我想制作一个我可以使用的小应用程序,并告诉我的老板该网站有多不安全。

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

所以我的理论是,黑客知道他可以强制使用确认码的用户名,使用户密码毫无价值。

任何人都知道开始制作这样的节目的好地方吗?

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

8 个答案:

答案 0 :(得分:3)

答案 1 :(得分:2)

这大约有281万亿组合。对他们进行暴力破解需要花费足够长的时间才能成为您网站的问题。

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

托马斯建议,通过让代码在一周左右后超时,将引入额外的安全性。

答案 2 :(得分:2)

首先,如果确认码是真正随机的,那么将有16个 12 = 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");
}

答案 3 :(得分:2)

我知道这可能不是一个公认的答案,但这似乎相当安全,每个角色有16个可能的位置。

16^12 = 2.81474977 × 1014

答案 4 :(得分:2)

对于给定的代码长度,有281474976710655可能的组合。即使尝试一个代码需要1秒钟,它也需要数年时间来强制它......

如果你想尝试,你需要写一些类似的东西:

for (Int64 i = 0; i < 281474976710655; i++) {
    string code = i.ToString ("X12");

    //write code here to attempt this code
}

答案 5 :(得分:2)

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

为确保您可以将到期时间与确认代码相关联。使其有效仅24小时,或3天,或任何你想要的

答案 6 :(得分:2)

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

请注意,这需要对所有帐户中的帐户重置总次数上的给定确认代码的次数设置上限。在某些情况下,后者可能会成为一个问题,例如,如果新闻报道(真实或错误地)您的用户数据库已被盗用并且每个人都急于更改其密码。

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

答案 7 :(得分:1)

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

另一种思考方式是,即使黑客暴力强制代码,你也会使用新的随机密码将新电子邮件发送给原始用户的“结果” - 所以黑客已经实现了重置用户的密码,实际上并没有帮助他们!

因此,组合代码的问题,蛮力的尝试 - 是多余的。

相关问题