某些应用程序(或网站)在您键入时会计算密码的复杂性。
它们通常显示一个红色的条,该条变成橙色,然后变为绿色,然后随着您的密码变长而变绿,并且包含更多类别的字符(例如,小写,大写,标点符号,数字)。
如何可靠地计算密码的复杂度?
我想出了以下算法,但由于它只有7个字符长,因此它被评定Password1!为“非常强”和]@feé:m“弱” 这一事实令我感到担忧。
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; }
如果您有时间检查所有可能的规则,那么使用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年。
要使用它,则只需跟踪看到的字符种类,构造适当的乘数,根据密码长度计算预期的排列,然后将其与预定义的截止值进行比较即可确定密码的强度。