Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 如何计算密码复杂性_Algorithm_Security_Passwords - Fatal编程技术网

Algorithm 如何计算密码复杂性

Algorithm 如何计算密码复杂性,algorithm,security,passwords,Algorithm,Security,Passwords,某些应用程序(或网站)在键入密码时计算密码的复杂性 它们通常会显示一个红色条,该条会先变为橙色,然后变为绿色,随着密码变长,甚至会变为绿色,并且包含更多类别的字符(例如,小写、大写、标点符号、数字) 如何可靠地计算密码的复杂性? 我提出了下面的算法,但我担心的是,它的速度Password1为“非常强”,而]@feé:m为“弱”,因为它只有7个字符长 private int GetPasswordComplexity(string password) { if (password.Leng

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

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

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

我提出了下面的算法,但我担心的是,它的速度
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;
}
private int GetPasswordComplexity(字符串密码)
{

如果(password.Length当你看到一个数字、大写字母等时,我不会简单地设置一个标志,而是给他们打分。类似于分数系统。一个普通字母计数1,一个数字2和一个特殊字符3


现在,您的总密码数既包括字符数,也包括密码的组成方式。您只需划分弱密码和强密码。

我建议使用cracklib。如果您有足够的时间检查所有潜在规则,使用类似cracklib的工具是非常好的。如果您只需要NT快速的东西——比如说基于JavaScript的强度计——然后考虑估计一个蛮力攻击所需要的潜在猜测的数量。对于每一个字符类型,根据该类型的潜在字符的数量更新一个乘法器。因此,如果你只有数字,那么乘法器将是10。如果只有小写字母,则乘数为26。如果两者都有,则乘数为36——也就是说,对于密码中的每个字符,暴力攻击最多需要尝试36个不同的字符。同时包含大写字母和小写字母、数字和标点符号的密码,则乘数为10+26+26+32=94(或多或少取决于允许的标点符号)

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

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


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

您还应该对照字典进行检查。我想苹果是这样做的这是内置的密码检查器。

您可以在这里获得python绑定:好主意。但是:复杂性(“PasswordPassword”)=52^17=1.5^10^29复杂性(“!:^dE1”)=94^6=6x10^11现在,哪个密码更强?这只是一个粗略的衡量。你可能还想筛选最常用的密码。也许如果大写字母和标点符号“值”更高,它会得分更高,而没有数字的普通日常小写字母会得分更低(因为它们的“值”)这是在元上讨论的。一个特殊字符所加的熵小于一个数字的熵。一个数字所加的熵小于一个字符的熵。你应该计算熵。这是在元上讨论的