2

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

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

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

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

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

4

8 回答 8

2

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

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

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

于 2010-08-12T11:34:09.873 回答
2

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

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

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

于 2010-08-12T10:17:50.150 回答
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");
}
于 2010-08-12T10:18:09.727 回答
2

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

16^12 = 2.81474977 × 1014
于 2010-08-12T10:18:48.760 回答
2

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

不过,如果您想尝试,您需要编写如下内容:

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

    //write code here to attempt this code
}
于 2010-08-12T10:20:44.400 回答
2

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

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

于 2010-08-12T10:21:55.913 回答
1

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

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

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

于 2012-04-20T07:01:47.640 回答