第2章 密码认证问题
核心议题 弱密码风险 · 密码存储安全(哈希加盐)· 密码策略最佳实践
2.1 弱密码风险 常见威胁
弱密码是认证链中最薄弱的环节。攻击者通过暴力破解、字典攻击、撞库等方式,可轻易获取账户权限。以下表格列出典型弱密码类型及风险等级。
| 弱密码类型 | 示例 | 风险等级 |
|---|---|---|
| 纯数字短密码 | 123456, 000000 | 极高 |
| 常见单词/键盘模式 | password, qwerty, 1qaz2wsx | 极高 |
| 个人信息相关 | zhangsan1990, birthday | 高 |
| 重复字符 | aaaaaa, 111111 | 极高 |
💡 真实案例: 2021年某大型社交平台因弱密码导致超5亿用户凭证泄露,其中超过30%的用户使用“123456”或“password”。
2.2 密码存储安全:哈希 + 盐 核心防御
明文存储密码是致命错误。正确的做法是使用密码哈希函数(如 bcrypt、Argon2、scrypt)并加入随机盐,防止彩虹表攻击和预计算攻击。
推荐哈希算法对比
| 算法 | 抗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个字符,鼓励使用短语或随机组合。
- 黑名单检查:禁止使用已知泄露密码(如Have I Been Pwned API)。
- 多因素认证:密码+OTP/生物识别,极大降低风险。
- 账户锁定:连续5次失败后临时锁定15分钟。
- 密码过期:建议90~180天轮换,但NIST最新指南不强制频繁更换。
📌 策略速查表: 密码最小长度12字符,包含大写、小写、数字、符号(非强制但推荐);禁止键盘序列和重复字符;使用加盐哈希存储;每年至少一次安全培训。