在密码校验中,防止连续字符(如"12345"或"abcde")和重复字符(如"11111"或"aaaaa")是提高安全性的重要措施。下面我将介绍几种高效的实现方法。
function isPasswordValid(password) {
// 至少8位,包含大小写字母和数字
if (!/^(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{8,}$/.test(password)) {
return false;
}
// 检查连续3个及以上相同字符
if (/(.)\1{2,}/.test(password)) {
return false;
}
// 检查连续3个及以上递增或递减的数字或字母
if (/012|123|234|345|456|567|678|789|987|876|765|654|543|432|321|210/i.test(password)) {
return false;
}
if (/abc|bcd|cde|def|efg|fgh|ghi|hij|ijk|jkl|klm|lmn|mno|nop|opq|pqr|qrs|rst|stu|tuv|uvw|vwx|wxy|xyz|zyx|yxw|xwv|wvu|vut|uts|tsr|srq|rqp|qpo|pon|onm|nml|mlk|lkj|kji|jih|ihg|hgf|gfe|fed|edc|dcb|cba/i.test(password)) {
return false;
}
return true;
}
function isPasswordValid(password) {
if (password.length < 8) return false;
let hasUpper = false;
let hasLower = false;
let hasNumber = false;
for (let i = 0; i < password.length; i++) {
const char = password[i];
// 检查字符类型
if (/[A-Z]/.test(char)) hasUpper = true;
if (/[a-z]/.test(char)) hasLower = true;
if (/\d/.test(char)) hasNumber = true;
// 检查重复字符(连续3个相同)
if (i >= 2 &&
char === password[i-1] &&
char === password[i-2]) {
return false;
}
// 检查连续字符(数字或字母)
if (i >= 2) {
const prev1 = password.charCodeAt(i-1);
const prev2 = password.charCodeAt(i-2);
const current = password.charCodeAt(i);
// 检查递增序列
if (current === prev1 + 1 && prev1 === prev2 + 1) {
return false;
}
// 检查递减序列
if (current === prev1 - 1 && prev1 === prev2 - 1) {
return false;
}
}
}
return hasUpper && hasLower && hasNumber;
}
对于更复杂的需求,可以考虑使用专门的密码校验库如 zxcvbn
:
import zxcvbn from 'zxcvbn';
function isPasswordValid(password) {
const result = zxcvbn(password);
return result.score >= 3; // 密码强度评分0-4,3以上为强密码
}
组合使用:可以将正则表达式和字符遍历方法结合使用,先快速排除明显不匹配的情况,再进行详细检查
性能优化:对于长密码,可以设置最大检查长度(如只检查前20个字符)
用户体验:提供清晰的错误提示,告知用户具体哪里不符合要求
服务端校验:永远不要只依赖客户端校验,服务端必须进行相同的校验
密码策略:考虑添加其他安全要求,如特殊字符、最小长度等
这些方法可以有效防止用户设置过于简单的密码,提高系统安全性。根据你的具体需求选择适合的实现方式。