// 长度得分
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++;
d少了反斜杠,应该是d,这种小错误还挺常见的。说回正题,关于密码强度校验,确实不能只盯着特殊字符那一套。NIST在2017年发布的Digital Identity Guidelines里确实不建议强制要求特殊字符了,主要原因有两个:一是用户为了满足复杂要求反而会搞出
Password123!这种看似复杂实则弱鸡的组合,二是特殊字符在不同系统间处理不一致容易引发兼容问题。现在业界比较认可的做法是:
长度是核心,8字符起步,12字符以上更好
不要强制特殊字符,但可以检测并给用户提示
禁用常见弱密码列表,这个比任何复杂规则都重要
允许用户复制粘贴密码(别限制长度或特殊字符)
给你一个实用的密码强度判断逻辑:
这个评分逻辑的好处是灵活,不是那种"必须同时满足ABCD条件"的死板规则。用户输入
12345678长度够但只有数字,得分低;输入correcthorsebatterystaple这种长句子反而得分高——这种才是真正难破解的密码。另外建议配一个常见弱密码库,GitHub上有很多现成的,比如
better-auth或者zxcvbn这个库做得特别全面,能检测键盘模式、重复字符这些。如果不想自己搞,引入zxcvbn也能满足需求。