13

某些应用程序(或网站)会在您键入时计算密码的复杂性。

它们通常会显示一个红色条,该条会变成橙色,然后是绿色,然后随着密码变长甚至更绿,并且包含更多类别的字符(例如,小写字母、大写字母、标点符号、数字)。

如何可靠地计算密码的复杂性?

我提出了以下算法,但我担心它被Password1!评为“非常强”和]@feé:m“弱”,因为它只有 7 个字符长。

private int GetPasswordComplexity(string password)
{
    if (password.Length <= 4)
        return 1;

    int complexity = 0;

    int digit = 0;
    int letter = 0;
    int cap = 0;
    int other = 0;

    for (int i = 0; i < password.Length; i++)
    {
            if (char.IsDigit(password[i]) && i!=password.Length-1)
            digit = 1;
        else if (char.IsLower(password[i]))
            letter = 1;
        else if (char.IsUpper(password[i]) && i!=0)
            cap = 1;
        else
            other = 1;
    }

    complexity = digit + letter + cap + other;

    if (password.Length <= 7)
        complexity = Math.Min(3, complexity);

    return complexity;
}
4

4 回答 4

32

如果您有时间检查所有潜在规则,那么使用像cracklib 这样的东西是非常好的。如果你只是想要一些快速的东西——比如基于 javascript 的强度计——然后考虑估计暴力攻击所需的潜在猜测的数量。对于看到的每种字符类型,都会根据该类型的潜在字符数更新一个乘数。因此,如果您只有数字,则乘数将为 10。如果您只有小写字母,则乘数为 26。如果两者都有,则乘数为 36——即对于密码中的每个字符,暴力攻击将需要尝试多达 36 个不同的字符。包含大小写字符、数字和标点符号的密码,

要估计蛮力方法将采用的最大排列数,请将乘数提高到等于密码中位数的幂。这为您提供了使用暴力攻击破解密码所需的最大猜测次数。假设每次猜测需要一个 cpu 周期,并且给定最快的处理器,计算在给定一定数量的排列的情况下破解密码需要多长时间。例如,如果我的乘数为 10,密码长度为 10 个字符,那么我将有 10,000,000,000 个可能的组合。在 3GHz 处理器上,这应该花费 10/3 * k 或 3k 秒(其中 k 是每次猜测的周期数,通常很小)。显然,这是一个弱密码。

现在,建立一些代表合理密码强度的范围。例如,如果您认为中等强度至少需要包含大小写字符的 8 个字符的密码,那么在 3GHz 处理器上您的截止值将是 52^8 或大约 1.5 年(假设 k = 1)。如果添加数字,则在 3GHz 处理器上,截止值变为 62^8 或大约 8 年。

要使用它,您只需要跟踪您看到的字符类型,构建适当的乘数,根据密码长度计算预期排列,并将其与预定义的截止值进行比较,以确定密码的强度。

于 2008-12-25T18:55:32.443 回答
8

我建议为此使用cracklib。

于 2008-12-25T16:32:07.070 回答
3

当您看到数字、大写字母等时,我不会简单地设置一个标志,而是为它们打分。类似于评分系统的东西。一个普通的字母算 1,一个数字算 2,一个特殊字符算 3。

现在,您的总数既考虑了字符数,也考虑了密码的构成方式。你只需要为弱点和强点画线。

于 2008-12-25T16:28:32.397 回答
1

您还应该检查字典。我认为苹果在它的内置密码检查器中做到了这一点。

于 2008-12-25T21:03:29.830 回答