本文目录导读:

口令(密码)复杂度设置是网络安全的第一道防线,规范的设置需要平衡安全性(难以被破解)与可用性(便于记忆和输入)。
以下是基于行业标准(如NIST SP 800-63B、OWASP等)和实际攻防经验的口令复杂度规范指南:
核心原则:长度优先,复杂度次之
过去20年,安全界一直强调“必须包含大写、小写、数字、特殊符号”,但现代攻防实践表明:长口令比复杂短口令更安全。
- 长度是安全性的基石:每增加一个字符,暴力破解的难度呈指数级上升。
- 复杂度是辅助:防止字典攻击和简单的模式匹配。
具体规范设置建议
最小长度要求
- 最低标准:8个字符(已接近过时,容易被弱GPU集群破解)。
- 推荐标准:12-16个字符。
- 高安全等级:20个字符以上(如管理员、财务系统、核心数据库)。
- 密码短语:建议用户使用句子或短语(如
IloveEatingPizzaInNYC!),而非单个单词。
字符组成(不再强制“必含所有类型”)
现代标准(如NIST最新指南)更推荐检查常见弱口令,而非强制混合大小写。
- 推荐策略:至少包含以下至少3种字符类型,或直接接受长密码短语:
- 大写字母 (A-Z)
- 小写字母 (a-z)
- 数字 (0-9)
- 特殊符号 (
!@#$%^&*()_+-=[]{}|;':",./<>?)
- 应避免的强制规则:不要强制用户必须以数字开头、不要强制每月更换密码(这将导致用户使用简单变体,如
Password1!->Password2!)。
复杂度的“红线”:必须禁止的内容
无论口令多长多复杂,以下内容必须被系统拒绝:
- 包含用户名、邮箱前缀、真实姓名。
- 常见的弱口令(Top 100-1000弱口令列表)。
123456,password,qwerty,admin,welcome,iloveyou,abc123,password123
- 键盘序列:
asdfghjkl,1qaz2wsx,qwertyuiop - 重复字符:
aaaaaa,111111,abcdabcd - 常见数字序列:
12345678,654321 - 泄露过的口令:高级系统应联网或本地校验,是否已在公开数据泄露中出现(如通过Have I Been Pwned API)。
用户体验与可用性建议
糟糕的复杂度规则会导致用户把密码写在便签纸上,好的规范应帮助用户:
-
推广“密码短语”:
- 允许空格,允许很长的句子。
- 示例:
MyDogLovesToChaseTheBlueBall!比Mb&7#kP2更安全且更好记。
-
提供实时强度指示器:
- 在用户输入时,立刻打分并提示“太弱(常见密码)”、“弱(过短)”、“强(16位+包含符号)”。
- 向用户解释为什么弱(“此密码曾在数据泄露中出现过”)。
-
避免频繁强制更改:
- 除非确认泄露,否则不再强制90天换密(NIST新标准),频繁更换只会让用户使用可预测的模式。
- 如果必须更换,禁止用户使用与最近5次历史密码相似的密码。
前端技术实现规范(开发者必看)
如果你需要在系统中实现口令复杂度校验,建议这样做:
检查逻辑伪代码
function isPasswordValid(password, userInfo) {
const minLength = 12;
const hasUpper = /[A-Z]/.test(password);
const hasLower = /[a-z]/.test(password);
const hasDigit = /[0-9]/.test(password);
const hasSpecial = /[!@#$%^&*()_+{}|:">?<~`]/.test(password);
// 1. 长度检查
if (password.length < minLength) return false;
// 2. 至少包含3种字符类型
const typeCount = [hasUpper, hasLower, hasDigit, hasSpecial].filter(Boolean).length;
if (typeCount < 3) return false;
// 3. 禁止包含用户名/邮箱
if (userInfo && password.includes(userInfo.username) return false;
// 4. 检查常见弱口令列表 (可使用开源名单)
if (commonWeakPasswords.includes(password.toLowerCase()) return false;
// 5. 检查重复/序列 (可选)
if (/(.)\1{3,}/.test(password)) return false; // 如 "aaaa"
if (/123456|qwerty|password/.test(password.toLowerCase()) return false;
return true;
}
推荐的工具库
- zxcvbn (Dropbox出品):评估口令强度,而非简单规则匹配,它能识别常见模式、键盘序列、日期等。
- Have I Been Pwned API:检查密码是否在已知泄露中。
总结表格:规范对比
| 维度 | 旧规范(不推荐) | 新规范(推荐) |
|---|---|---|
| 核心策略 | 强制复杂字符,短而繁 | 鼓励长密码,长而简 |
| 最小长度 | 6-8字符 | 12-16字符 |
| 大写字母 | 必须包含 | 建议包含,但不强制 |
| 特殊符号 | 必须包含 | 如果较长,可放宽 |
| 更换频率 | 90天强制更换 | 只有泄露时才更换 |
| 检查重点 | 复杂性规则 | 是否在常见弱口令/泄露库中 |
| 用户提示 | “请输入至少一个数字” | “这个密码很好,但建议再加3个词” |
特别警告:绕过不好的规范
很多不良规范实际上会降低安全性,常见的坑有:
- “密码必须包含特殊字符,且长度8位” → 用户会设
P@ssw0rd!,这对黑客来说属于“幼儿园难度”。 - “密码不能与前三代相同” → 用户会设
NewPassword1!->NewPassword2!。 - 限制最大长度(如20位) → 阻止了用户使用安全的密码短语。
最安全的设置,是让用户创建一个自己记得住、但又足够长(>16位)、且不与其他网站重复的密码。 配合多因素认证(MFA),比任何口令复杂度规则都更能保障安全。