某些应用程序(或网站)会在您键入时计算密码的复杂性.
它们通常显示一个红色条,它变为橙色,然后变为绿色,然后在密码变长时更加绿色,并包含更多类别的字符(例如,小写,大写,标点符号,数字).
如何可靠地计算密码的复杂性?
我已经提出了以下算法,但是我担心它被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; }
tvanfosson.. 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年.
要使用它,您只需要跟踪您看到的字符类型,构建适当的乘数,根据密码长度计算预期的排列,并将其与预定义的截止值进行比较,以确定密码的强度.
如果你能负担得起检查所有潜在规则的时间,那么使用像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年.
要使用它,您只需要跟踪您看到的字符类型,构建适当的乘数,根据密码长度计算预期的排列,并将其与预定义的截止值进行比较,以确定密码的强度.
我建议使用cracklib.