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

统赫酱~ 阅读 2

我在做用户注册页,想加个密码强度提示,但不确定怎么判断才算安全。试过只看长度,但用户输12345678也能过,这显然不行。

现在想结合大小写字母、数字和特殊字符,但不知道规则怎么定。比如下面这个正则:

/^(?=.*[a-z])(?=.*[A-Z])(?=.*d)(?=.*[@$!%*?&])[A-Za-zd@$!%*?&]{8,}$/

可又听说现在NIST不推荐强制特殊字符了?到底该用啥策略啊,有没有业界通用的做法?

我来解答 赞 1 收藏
二维码
手机扫码查看
1 条解答
长孙锦锦
你那个正则确实有问题,d 少了反斜杠,应该是 d,这种小错误还挺常见的。

说回正题,关于密码强度校验,确实不能只盯着特殊字符那一套。NIST在2017年发布的Digital Identity Guidelines里确实不建议强制要求特殊字符了,主要原因有两个:一是用户为了满足复杂要求反而会搞出 Password123! 这种看似复杂实则弱鸡的组合,二是特殊字符在不同系统间处理不一致容易引发兼容问题。

现在业界比较认可的做法是:

长度是核心,8字符起步,12字符以上更好
不要强制特殊字符,但可以检测并给用户提示
禁用常见弱密码列表,这个比任何复杂规则都重要
允许用户复制粘贴密码(别限制长度或特殊字符)

给你一个实用的密码强度判断逻辑:

function checkPasswordStrength(password) {
const commonPasswords = ['123456', 'password', '12345678', 'qwerty', 'abc123'];

if (commonPasswords.includes(password.toLowerCase())) {
return { level: 0, message: '太常见了,换一个' };
}

let score = 0;

// 长度得分
if (password.length >= 8) score++;
if (password.length >= 12) score++;
if (password.length >= 16) score++;

// 字符类型得分
if (/[a-z]/.test(password)) score++;
if (/[A-Z]/.test(password)) score++;
if (/[0-9]/.test(password)) score++;
if (/[^a-zA-Z0-9]/.test(password)) score++;

// 强度等级
if (score < 3) return { level: 1, message: '弱' };
if (score < 5) return { level: 2, message: '一般' };
if (score < 7) return { level: 3, message: '强' };
return { level: 4, message: '非常强' };
}


这个评分逻辑的好处是灵活,不是那种"必须同时满足ABCD条件"的死板规则。用户输入 12345678 长度够但只有数字,得分低;输入 correcthorsebatterystaple 这种长句子反而得分高——这种才是真正难破解的密码。

另外建议配一个常见弱密码库,GitHub上有很多现成的,比如 better-auth 或者 zxcvbn 这个库做得特别全面,能检测键盘模式、重复字符这些。如果不想自己搞,引入 zxcvbn 也能满足需求。
点赞
2026-03-10 17:30