简言
用正则表达式做用户密码强度的通过性判定,过于简单粗暴,不但用户体验差,而且用户帐号安全性也差。那么如何准确评价用户密码的强度,保护用户帐号安全呢?本文分析介绍了几种基于规则评分的密码强度检测算法,并给出了相应的演示程序。大家可以根据自己项目安全性需要,做最适合于自己的方案选择。
1方案1(简单)
方案1算法通过密码构成分析,结合权重分派,统计得出密码强度得分。得分越高,表示密码强度越大,也就越安全。方案1算法思想简单,实现容易。
1.1方案1评分标准
一、密码长度:
-
<李> 5分:小于等于4个字符李>
<李> 10分:5到7字符李>
<李> 25分:大于等于8个字符李>
二,字母:
-
<李> 0分:没有字母李>
<李> 10分:全都是小(大)写字母李>
<李> 20分:大小写混合字母李>
三,数字:
-
<李> 0分:没有数字李>
<李> 10分:1个数字李>
<李> 20分:大于1个数字李>
四、符号:
-
<李> 0分:没有符号李>
<李> 10分:1个符号李>
<李> 25分:大于1个符号李>
五,奖励:
-
<李> 2分:字母和数字李>
<李> 3分:字母,数字和符号李>
<李> 5分:大小写字母,数字和符号李>
1.2方案1等级划分
根据密码评分,将密码划分成以下7个等级:
-
<李> \祝辞=90:非常安全(VERY_SECURE) 李>
<李> \祝辞=80:安全(安全)李>
<李> \祝辞=70:非常强(VERY_STRONG) 李>
<李> \祝辞=60:强(强)李>
<李> \祝辞=50:一般(平均)李>
<李> \祝辞=25:弱(弱)李>
<李> \祝辞=0:非常弱(VERY_WEAK) 李>
该评分标准及等级划分,实际使用时,可小做调整,但不建议做大的变动。
1.3方案1演示程序
演示程序
1.4方案1测试分析
<=坝镅詊avascript代码类>//评25分,纯小写字母无法通过验证 console.log (aaaaaaaa .score ());//评分45,纯数字无法通过验证 console.log (“11111111”.score ());//评分47岁的小写+数字无法通过验证 console.log (aa111111 .score ());//评分45岁小写+大写无法通过验证 console.log (aaaaAAAA .score ());//评50分,4位密码不可能通过验证 console.log (“11 ! !”.score ());//评70分,5位密码可通过验证 console.log (“0 aa !”.score ());//评67分,小写+大写+数字可通过验证(8位) console.log (aA000000 .score ());//评70分,数字+符号可通过验证 console.log(“000000年!”.score()); 代码>
从以上测试结果中,我们可以看出算法是十分的有效的,基本能够保证密码具有一定的安全性。但是存在的问题也很明显,其中最主要的问题是对重复或连续的字符评分过高。以测试用例中最后一个为例:<代码> 000000 ! !> 代码可以得到70分,但显然并不是一个非常强壮的密码。
另外,方案1最高可以得到95分,也就是说没有100分(绝对安全)的密码,这一点也是很有智慧的设计。
2方案2
针对方案1中的不足,方案2中引入了减分机制。对于重复出现,连续出现的字符给予适当的减分,以使得密码评分更准确,同时在方案2中密码的评分基数及计算过程都十分的复杂,要想理解其中每一步的含义,请保持足够的耐心。
2.1方案2加分项
一、密码长度:
-
<李>公式:+ (n * 4),其中n表示密码长度李>
二、大写字母:
-
<李>公式:+ ((len-n) * 2),其中n表示大写字母个数,len表示密码长度李>
三,小写字母:
-
<李>公式:+ ((len-n) * 2),其中n表示小写字母个数,len表示密码长度李>
四,数字:
-
<李>公式:+ (n * 4),其中n表示数字个数李>
<李>条件:满足n & lt;兰,才能得到加分,len表示密码长度李>
五、符号:
-
<李>公式:+ (n * 6),其中n表示符号个数李>
六、位于中间的数字或符号:
-
<李>公式:+ (n * 2),其中n表示位于中间的数字或符号个数李>
七、最低条件得分: