用正则表达式做用户密码强度的通过性判定,过于简单粗暴,不但用户体验差,而且用户帐号安全性也差。那么如何准确评价用户密码的强度,保护用户帐号安全呢?本文分析介绍了几种基于规则评分的密码强度检测算法,并给出了相应的演示程序。大家可以根据自己项目安全性需要,做最适合于自己的方案选择。
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: 安全(SECURE)
>= 70: 非常强(VERY_STRONG)
>= 60: 强(STRONG)
>= 50: 一般(AVERAGE)
>= 25: 弱(WEAK)
>= 0: 非常弱( VERY_WEAK)
该评分标准及等级划分,实际使用时,可小做调整,但不建议做大的变动。
1.3 方案1演示程序演示程序
1.4 方案1测试分析// 评分 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("0aA!!".score()); // 评分 67,小写+大写+数字可通过验证(8位) console.log("aA000000".score()); // 评分 70,数字+符号可通过验证 console.log("000000!!".score());