JavaScript 可配置密码强度验证算法与打分规则实现

作者:异步漫步

时间:2026-10-25

浏览:333

本文介绍一种基于打分机制的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


到这里就结束了,欢迎大家一起来讨论这个打分的规则,大家也可以直接给出自己写好的规则和代码,这样方便大家研究和交流,代码是需要不断维护和更新的,这样我们才能站在前人的脚本上面继续前进。

实用工具推荐

电子包浆

绿化、压缩、噪点和虚拟水印,自由调节做旧程度。

使用 ›
图片压缩

选择画质和输出格式,预览压缩前后的大小。

使用 ›
相关文章