前端密码强度校验怎么写才靠谱?

上官奕瑞 阅读 29

我在做登录注册页的密码策略,想让用户设置强密码,但不确定校验逻辑怎么写才安全又不烦人。试了下正则,但总觉得漏了什么。

比如下面这段代码,只检查了长度和是否包含数字,但好像没考虑大小写字母和特殊字符?而且用户反馈说提示太模糊,不知道具体哪里不符合要求。

function validatePassword(pwd) {
  if (pwd.length < 8) return false;
  if (!/d/.test(pwd)) return false;
  return true;
}

有没有更全面又用户体验好的写法?要不要分等级提示(比如弱/中/强)?

我来解答 赞 8 收藏
二维码
手机扫码查看
1 条解答
司空一鸣
你这段代码确实漏了很多,光检查长度和数字太简陋了。我给你一个完整点的方案:

function checkPasswordStrength(password) {
if (!password) {
return { level: 0, valid: false, message: '请输入密码' };
}

let score = 0;
const checks = [];

// 长度检查
if (password.length >= 8) {
score += 1;
} else {
checks.push('至少8个字符');
}

// 字符类型检查
if (/[a-z]/.test(password)) score += 1;
else checks.push('小写字母');

if (/[A-Z]/.test(password)) score += 1;
else checks.push('大写字母');

if (/d/.test(password)) score += 1;
else checks.push('数字');

if (/[!@#$%^&*(),.?":{}|<>]/.test(password)) score += 1;
else checks.push('特殊字符');

// 强度等级判定
let level, valid, message;

if (password.length < 8) {
level = 0;
valid = false;
message = '密码长度不足';
} else if (score <= 2) {
level = 1;
valid = true;
message = '弱:还差' + checks.join('、');
} else if (score === 3) {
level = 2;
valid = true;
message = '中:还可以再加强';
} else {
level = 3;
valid = true;
message = '强:密码强度良好';
}

return { level, valid, message, score };
}


调用一下看看效果:

const result = checkPasswordStrength('Abc123!');
console.log(result);
// { level: 2, valid: true, message: '中:还可以再加强', score: 4 }


几个关键点:

长度必须8位以上这个是底线,没得商量。字符类型检查就4种:小写、大写、数字、特殊字符,你漏了大小写和特殊字符。分数制比单纯的true/false灵活,4项全有就是强,少一项扣一分。提示信息直接告诉用户缺什么,比"密码不符合要求"这种废话有用多了。

如果想更严格可以把长度改成12位,特殊字符列表也可以根据业务调整。复制这个改改就能用。
点赞
2026-03-14 04:01