首页/开发/正则与编码速查/密码强度校验正则的组合思路
正则进阶45 条

密码强度校验正则的组合思路

密码强度校验用零宽前瞻组合表达「各类字符至少一个」,长度限制放在末段字符集上,顺序无关是前瞻的天然优势。正则只能判断字符类别是否存在,无法判断是否好猜,长度上限与哈希算法输入限制必须另行处理。

正则与编码速查开发更新于 2026-10-17
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌​​‌​‌‌‌‌​‌‌‌​​‌​​‌‌​​‌​‌​‌‌​​‌‌‌​‌‌​​‌​‌​‌‌‌‌​​​​​‌​‌‌‌‌​‌‌‌​​​​​‌‌​​​​‌​‌‌‌​​‌‌​‌‌‌​​‌‌​‌‌‌​‌‌‌​‌‌​‌‌‌‌​‌‌‌​​‌​​‌‌​​‌​​​​‌​‌‌​‌​‌‌‌​​‌‌​‌‌‌​‌​​​‌‌‌​​‌​​‌‌​​‌​‌​‌‌​‌‌‌​​‌‌​​‌‌‌​‌‌‌​‌​​​‌‌​‌​​​​​‌​‌‌​‌​‌‌‌​​‌​​‌‌​​‌​‌​‌‌​​‌‌‌​‌‌​​‌​‌​‌‌‌‌​​​​​‌​‌‌‌​​‌‌​‌​​​​‌‌‌​‌​​​‌‌​‌‌​‌​‌‌​‌‌​​

密码强度校验正则的组合思路

「至少包含大写、小写、数字、符号各一个」这类规则最适合用零宽前瞻组合:每个前瞻只负责检查某一类字符是否存在,彼此顺序无关,整条模式在长度约束下依次检查完就放行。要清楚它的边界:正则能判断字符类别是否出现,判断不了密码好不好猜。

基本信息

基本结构多个 (?=…) 前瞻叠加,最后一个字符集加量词负责整体长度
顺序无关前瞻只做检查不消耗字符,因此四类字符的先后位置不影响结果
点号限制点号默认不匹配换行,需要允许换行时改用显式的空白与非空白组合
表达力边界无法表达「不含用户名」「不在弱口令表」「熵足够」这类判断

典型使用场景

  • 注册密码规则:在表单层与接口层各校验一次,保证前后端判定一致
  • 密码修改流程:新密码校验通过后再进入哈希与入库环节
  • 批量导入账号:把不合规的初始密码列入待处理清单,而不是直接忽略
  • 合规自测:按内部安全基线检查存量账号是否满足基本字符类别要求
  • 前端即时提示:给出缺哪一类字符的明确反馈,减少反复提交

组合前瞻写法

组合前瞻写法
# 至少一个小写、一个大写、一个数字、一个非字母数字字符,长度 10 到 64
^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[^A-Za-z0-9])\S{10,64}$
# 允许任意非空白字符时,用点号会漏掉换行,需要显式组合
^(?=[\s\S]*[a-z])(?=[\s\S]*[A-Z])(?=[\s\S]*\d)[\s\S]{10,64}$
# 判断缺哪一类字符:用多个独立检查给出具体提示,而不是只返回失败
missing = [n for n, ok in (('小写', re.search(r'[a-z]', pw)),) if not ok]
# 强度评分不要用正则,交给专门库评估
# zxcvbn 类库会结合字典与常见模式给出分档结果

常见需求的写法与局限

需求正则写法局限
四类字符各至少一个多个前瞻叠加不问字符是否重复或可预测
长度区间末段字符集加量词上限要设,防止超长输入
不含空格用非空白字符集会连带排除其他空白符
不与用户名相同无法可靠表达需要代码比较
不在弱口令表无法表达需要字典或库
NIST SP 800-63B 的建议是以长度下限与弱口令黑名单为主,谨慎使用强制组合规则:过于严格的组合要求会促使用户选择形如首字母大写加感叹号结尾的可预测变体,实际强度反而下降。
长度上限必须设置:哈希函数对超长输入的开销会明显上升,缺少上限的密码字段可能被用来消耗服务端资源;使用 bcrypt 一类算法时还要注意其输入长度限制,超出部分会被截断。

易错点

  • 用点号承载任意字符:点号默认不匹配换行,密码中含换行时规则判断与实际存储不一致
  • 字符类范围写错:排除字母数字时忘记把空格排除,导致「符号」类别形同虚设
  • 前端与后端规则不一致:前端用一条模式、后端用另一条,用户能通过前端的密码在提交时被拒
  • 不设长度上限:超长输入放大哈希与校验开销,成为可被利用的资源消耗点
  • 只用正则做强度评分:正则看不到字典与键盘序列,评出的「强密码」可能一猜就中

数据来源与参考

  • NIST SP 800-63B:数字身份指南中的认证与口令要求
  • OWASP 认证备忘单:口令策略建议
  • Python 官方文档 re 模块:前瞻断言说明

整理校对:其其网ICT文档中心 · 本页地址:docs.qiqicto.com/regex/password-strength-regex.html

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌​​‌​‌‌‌‌​‌‌‌​​‌​​‌‌​​‌​‌​‌‌​​‌‌‌​‌‌​​‌​‌​‌‌‌‌​​​​​‌​‌‌‌‌​‌‌‌​​​​​‌‌​​​​‌​‌‌‌​​‌‌​‌‌‌​​‌‌​‌‌‌​‌‌‌​‌‌​‌‌‌‌​‌‌‌​​‌​​‌‌​​‌​​​​‌​‌‌​‌​‌‌‌​​‌‌​‌‌‌​‌​​​‌‌‌​​‌​​‌‌​​‌​‌​‌‌​‌‌‌​​‌‌​​‌‌‌​‌‌‌​‌​​​‌‌​‌​​​​​‌​‌‌​‌​‌‌‌​​‌​​‌‌​​‌​‌​‌‌​​‌‌‌​‌‌​​‌​‌​‌‌‌‌​​​​​‌​‌‌‌​​‌‌​‌​​​​‌‌‌​‌​​​‌‌​‌‌​‌​‌‌​‌‌​​