小编典典

如何计算密码复杂度

algorithm

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

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

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

我想出了以下算法,但由于它只有7个字符长,因此它被评定Password1!为“非常强”和]@feé:m“弱” 这一事实令我感到担忧。

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;
}

阅读 724

收藏
2020-07-28

共1个答案

小编典典

如果您有时间检查所有可能的规则,那么使用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年。

要使用它,则只需跟踪看到的字符种类,构造适当的乘数,根据密码长度计算预期的排列,然后将其与预定义的截止值进行比较即可确定密码的强度。

2020-07-28