本文介绍一种基于打分机制的JavaScript密码强度验证方案。通过基础分、加分与减分三部分计算总分,支持长度、字符类型及重复字符的灵活配置。提供完整JS代码及多组测试用例,总分50分制,涵盖弱至安全五级评价,便于后端逻辑迁移。
密码强度验证算法概述
前言:
密码强度校验是一项常见功能,核心难点在于如何制定合理的强度规则。随着安全需求升级,原有的简单验证方式已无法满足要求,因此需要一种可灵活配置且支持多级选择的密码强度验证机制。为此,设计了如下方案。在设计过程中,参考了市面上较为成熟的强度规则,其核心逻辑大同小异,均采用了打分机制来控制密码强度,从而具备较高的可配置性和灵活性。虽然曾考虑直接复用现有方案,但发现它们大多较为陈旧,部分规则并不完全契合当前公司的开发需求。鉴于此类功能相对基础,鲜有人进行更新或编写新代码,因此决定自行设计规则并编写实现代码。
实现:
打分机制与规则详解
原理:
该方案采用打分机制,分数由三部分构成:基础分、加分和减分。计算流程为:首先计算基础分,随后累加加分项,最后扣除减分项,所得结果即为最终总分。
规则:
密码允许输入的字符类型包括:数字、大写字母、小写字母以及特殊字符。
基础分计算规则如下:依据密码长度计分,每1个字符计1分,若长度超过18个字符,则上限为18分;若密码中包含至少一种上述可输入类型,则在基础分上额外加4分。
加分规则如下:针对每种密码可输入类型,若该类型字符的总数量大于等于2个,则加2分;若该类型字符的总数量大于等于5个,则再加2分(即累计加4分)。
减分规则如下:若存在连续重复的单个种类字符,每重复一次,总分减1分。
满分设定为50分。
0~10分:不合格(弱)
11~20分:一般
21~30分:中
31~40分:强
41~50分:安全
*注:分数区间可自由调整与搭配,整个打分规则均可根据实际需求进行修改。
JavaScript 实现代码与测试用例
code:
代码如下:
function passwordGrade(pwd) {
var score = 0;
var regexArr = ['[0-9]', '[a-z]', '[A-Z]', '[\\W_]'];
var repeatCount = 0;
var prevChar = '';
//check length
var len = pwd.length;
score += len > 18 ? 18 : len;
//check type
for (var i = 0, num = regexArr.length; i < num; i++) { if (eval('/' + regexArr[i] + '/').test(pwd)) score += 4; }
//bonus point
for (var i = 0, num = regexArr.length; i < num; i++) {
if (pwd.match(eval('/' + regexArr[i] + '/g')) && pwd.match(eval('/' + regexArr[i] + '/g')).length >= 2) score += 2;
if (pwd.match(eval('/' + regexArr[i] + '/g')) && pwd.match(eval('/' + regexArr[i] + '/g')).length >= 5) score += 2;
}
//deduction
for (var i = 0, num = pwd.length; i < num; i++) {
if (pwd.charAt(i) == prevChar) repeatCount++;
else prevChar = pwd.charAt(i);
}
score -= repeatCount * 1;
return score;
} 打分例子:
1111=7分
1@dA=20分
111111=9分
abcdef1=19分
abcd12=18分
abc123=18分
ab123A=22分
aA12j@=26分
aasdfkjjsjjj=16分
111111111dsfskjjkjeh=25分
1111dsfskjjkjeh=25分
1231kb#4ktSF!T@s^j#hkWH=50分
skhk3293ks=24分
sfh#4hHdk=29分
bure12#sk=27分
a@s@dk23=26分
bruceLi@09kt=34分
ce@Li1=24分
END
到这里就结束了,欢迎大家一起来讨论这个打分的规则,大家也可以直接给出自己写好的规则和代码,这样方便大家研究和交流,代码是需要不断维护和更新的,这样我们才能站在前人的脚本上面继续前进。