第2章 密码认证问题

核心议题 弱密码风险 · 密码存储安全(哈希加盐)· 密码策略最佳实践

2.1 弱密码风险 常见威胁

弱密码是认证链中最薄弱的环节。攻击者通过暴力破解、字典攻击、撞库等方式,可轻易获取账户权限。以下表格列出典型弱密码类型及风险等级。

弱密码类型示例风险等级
纯数字短密码123456, 000000极高
常见单词/键盘模式password, qwerty, 1qaz2wsx极高
个人信息相关zhangsan1990, birthday高
重复字符aaaaaa, 111111极高
弱密码 暴力破解 / 撞库 账户失陷 攻击面 自动化工具 数据泄露
💡 真实案例: 2021年某大型社交平台因弱密码导致超5亿用户凭证泄露,其中超过30%的用户使用“123456”或“password”。

2.2 密码存储安全:哈希 + 盐 核心防御

明文存储密码是致命错误。正确的做法是使用密码哈希函数(如 bcrypt、Argon2、scrypt)并加入随机盐,防止彩虹表攻击和预计算攻击。

用户密码 加盐 (Salt) 随机唯一字符串 哈希函数 bcrypt / Argon2 存储: 盐 + 哈希值

推荐哈希算法对比

算法抗GPU/ASIC盐自动处理推荐指数
Argon2id极高是⭐⭐⭐⭐⭐
bcrypt高是⭐⭐⭐⭐
scrypt高是⭐⭐⭐⭐
PBKDF2中需手动⭐⭐⭐
// 使用 bcrypt 哈希密码(Node.js 示例)
const bcrypt = require('bcrypt');
const saltRounds = 12;
const plainPassword = 'SecurePass!2025';

bcrypt.hash(plainPassword, saltRounds, function(err, hash) {
    // 存储 hash 到数据库 (hash 已包含盐)
    console.log(hash); // $2b$12$...
});

// 验证密码
bcrypt.compare(plainPassword, hash, function(err, result) {
    if (result) console.log('密码正确');
});

2.3 密码策略最佳实践 企业指南

结合 NIST SP 800-63B 及现代安全要求,推荐以下策略:

最小长度 ≥12 禁止常见弱密码 密码过期 ≥90天 MFA 启用 密码管理器 登录失败锁定 审计日志
  • 长度优先:至少12个字符,鼓励使用短语或随机组合。
  • 黑名单检查:禁止使用已知泄露密码(如Have I Been Pwned API)。
  • 多因素认证:密码+OTP/生物识别,极大降低风险。
  • 账户锁定:连续5次失败后临时锁定15分钟。
  • 密码过期:建议90~180天轮换,但NIST最新指南不强制频繁更换。
📌 策略速查表: 密码最小长度12字符,包含大写、小写、数字、符号(非强制但推荐);禁止键盘序列和重复字符;使用加盐哈希存储;每年至少一次安全培训。