在每年有数十亿凭证在数据泄露中曝光的世界里,为每个账户使用强大、唯一的密码已不再是可选项。然而,大多数人仍然依赖弱密码和重复使用的密码,攻击者可以在几秒内破解。随机密码生成器消除了人类偏见,创建能够抵抗暴力破解、字典攻击和彩虹表攻击的密码学强密码。本综合指南涵盖了生成安全密码所需的一切知识。
TL;DR
- 为每个账户使用随机密码生成器,永远不要凭记忆创建密码。
- 至少 16 个字符,包含大写、小写、数字和符号以获得最大熵。
- 密码短语(4-6 个随机词)同样强大且更易于在移动设备上输入。
- 将所有密码存储在密码管理器中,只记住主密码。
- 在每个支持的账户上启用双因素认证(TOTP 或硬件密钥)。
- NIST 2024 指南:越长越好,不强制轮换,检查泄露数据库。
核心要点
- 16 字符的混合字符随机密码具有超过 105 位熵,需要数万亿年才能暴力破解。
- 字典攻击可在几分钟内破解人类选择的密码。随机生成是唯一可靠的防御。
- 密码熵 = log2(字符池大小 ^ 长度)。每增加一个字符,搜索空间呈指数增长。
- NIST SP 800-63B(2024 更新)建议允许 64 字符以上的密码并检查泄露列表。
- 使用 6 个 Diceware 词的密码短语提供 77+ 位熵,且更易记忆。
- 双因素认证即使密码泄露也能减少超过 99% 的账户入侵。
1. 为什么强密码比以往更重要
凭证盗窃的规模已达到惊人的程度。仅 2024 年,就有超过 15 亿个唯一的用户名-密码组合在数据泄露中泄露。攻击者利用这些泄露的凭证进行自动化凭证填充攻击,在数百个热门服务上尝试每个被盗密码。
- 凭证填充攻击每小时测试数百万个被盗密码。
- 一个重复使用的密码可能导致电子邮件、银行、云存储和社交媒体全面沦陷。
- Hashcat 等自动化工具在消费级 GPU 上每秒可测试 1000 亿个密码哈希。
- 根据 IBM 的数据,2024 年数据泄露的平均成本达到 488 万美元。
解决方案很简单:为每个账户使用不同的随机生成密码。密码生成器消除人类可预测性,创建在数学上能抵抗所有已知攻击方法的密码。
2. 密码熵详解:安全背后的数学
密码熵以比特为单位衡量密码的不可预测性。计算公式为:H = L * log2(R),其中 L 是密码长度,R 是字符池大小。更高的熵意味着密码更难猜测。
字符池大小及每字符熵
| 字符集 | 池大小 (R) | 每字符比特数 | 示例 |
|---|---|---|---|
| 仅数字 (0-9) | 10 | 3.32 | 7291048365 |
| 小写字母 (a-z) | 26 | 4.70 | qmxbftzdkw |
| 大小写 (A-Za-z) | 52 | 5.70 | kRmBpTzYdW |
| 字母数字 (A-Za-z0-9) | 62 | 5.95 | k9mB2TzY0W |
| 完整 ASCII 可打印 | 95 | 6.57 | k9$B2!zY@W |
常见密码长度的总熵
| 长度 | 仅数字 | 小写字母 | 字母数字 | 完整 ASCII |
|---|---|---|---|---|
| 8 字符 | 26.6 位 | 37.6 位 | 47.6 位 | 52.6 位 |
| 12 字符 | 39.9 位 | 56.4 位 | 71.5 位 | 78.8 位 |
| 16 字符 | 53.2 位 | 75.2 位 | 95.3 位 | 105.1 位 |
| 20 字符 | 66.4 位 | 94.0 位 | 119.1 位 | 131.4 位 |
| 24 字符 | 79.7 位 | 112.8 位 | 142.9 位 | 157.7 位 |
这些计算假设每个字符都是均匀随机选择的。人类选择的密码有效熵要低得多,因为人类遵循可预测的模式。
2024-2025 年推荐熵目标:
- 一般网络账户:60+ 位
- 金融和电子邮件账户:80+ 位
- 加密密钥和主密码:100+ 位
# Entropy Formula
H = L * log2(R)
# Example: 16-char password, full ASCII (95 chars)
H = 16 * log2(95) = 16 * 6.57 = 105.1 bits
# Time to brute-force at 100 billion hashes/sec:
# 2^105.1 / 100,000,000,000 = ~1.29 * 10^21 seconds
# = ~40.9 trillion years
# For comparison, the universe is ~13.8 billion years old3. 什么使密码变得强大
强密码有三个基本属性:长度、随机性和唯一性。复杂性(混合字符类型)有帮助但次要于这三个属性。
每增加一个字符,搜索空间乘以字符池大小。NIST 建议允许最多 64 字符或更多。对于生成的密码,16-20 字符是安全性和可用性之间的最佳点。
人类在生成随机序列方面表现很差。密码学安全随机数生成器产生的输出在计算上与真正的随机性无法区分。
每个账户必须有不同的密码。如果你在电子邮件和小论坛使用相同的密码,论坛的泄露就等于给了攻击者你的电子邮件密码。
包含大写、小写、数字和符号将每字符熵从 4.70 位增加到 6.57 位。
4. 密码长度 vs 复杂性:哪个更重要?
答案很明确:长度胜出。更长但字符集较小的密码几乎总是比更短但字符集较大的密码更强。
看这两个密码:
k9$B(4 字符,完整 ASCII):熵 = 4 * 6.57 = 26.3 位
correcthorsebatterystaple(25 个小写字符):熵 = 25 * 4.70 = 117.5 位25 字符的小写密码比 4 字符的复杂密码强数十亿倍。
各字符集达到 80 位熵所需长度:
| 字符集 | 池大小 | 80 位所需字符 | 100 位所需字符 |
|---|---|---|---|
| 数字 (0-9) | 10 | 25 字符 | 31 字符 |
| 小写 (a-z) | 26 | 18 字符 | 22 字符 |
| 字母数字 | 62 | 14 字符 | 17 字符 |
| 完整 ASCII | 95 | 13 字符 | 16 字符 |
最佳实践:使用完整 ASCII 字符集加 16 字符以上,可达到 105+ 位熵。
5. NIST 2024 密码指南:有什么变化
NIST 更新了其数字身份指南(SP 800-63B),反映了对密码安全的现代理解。
NIST 设定 8 字符为绝对下限,但明确表示应鼓励更长的密码。
密码字段必须接受至少 64 个字符。截断密码被明确禁止。
不再建议要求大写、小写、数字和符号。
只有在有泄露证据时才应更改密码。
设置或更改密码时,系统必须检查已知泄露密码列表。
阻止密码字段粘贴会积极损害安全性。NIST 明确要求允许粘贴。
总体主题很清楚:让用户更容易使用长的、唯一的、随机生成的密码。
# NIST SP 800-63B (2024) Summary
+----------------------------------+----------------------------------+
| REMOVED (DO NOT) | REQUIRED / RECOMMENDED |
+----------------------------------+----------------------------------+
| Composition rules | Min 8 chars (recommend 15+) |
| Forced periodic rotation | Allow 64+ characters |
| Password hints | Check against breach databases |
| Security questions (KBA) | Allow paste in password fields |
| Truncating passwords | Support all Unicode characters |
| Blocking paste | Rate-limit failed attempts |
+----------------------------------+----------------------------------+6. 常见密码攻击及随机密码如何防御
了解攻击者如何破解密码有助于解释为什么随机生成是必要的。
暴力破解攻击系统地尝试每种可能的字符组合。现代 GPU 每秒可测试数十亿个组合。防御:长度。16 字符的完整 ASCII 随机密码即使以每秒 1000 亿次尝试也需要超过宇宙年龄的时间来破解。
字典攻击尝试常见单词、名字、短语和已知密码。它们还应用常见转换。防御:随机性。真正随机的密码不包含任何字典攻击可利用的模式。
彩虹表是预计算的查找表,将哈希值映射回原始密码。防御:加盐(由服务器处理)和长度。
凭证填充使用从一个服务泄露的用户名-密码对尝试登录其他服务。防御:唯一性。
16 字符以上的随机生成密码有效地中和了所有四种攻击类型。
# Attack Speed Reference (2024 Hardware)
# ─────────────────────────────────────────────────
# Hash Type │ Speed (hashes/sec) │ Hardware
# ─────────────────┼─────────────────────┼─────────
# MD5 │ 150 billion │ RTX 4090
# SHA-256 │ 22 billion │ RTX 4090
# bcrypt (cost=12) │ 32,000 │ RTX 4090
# Argon2id │ ~1,000 │ RTX 4090
# ─────────────────────────────────────────────────
# A 16-char full ASCII password (95^16):
# MD5: 95^16 / 150e9 = ~2.9e17 seconds = ~9.2 billion years
# Argon2id: 95^16 / 1000 = ~4.4e25 seconds = ~1.4e18 years7. 以编程方式生成密码
如果你需要在应用中生成密码,必须使用密码学安全随机数生成器(CSPRNG)。
JavaScript / Node.js(使用 Web Crypto API)
// Password Generator using Web Crypto API (browser & Node.js 19+)
function generatePassword(length = 16, options = {}) {
const {
uppercase = true,
lowercase = true,
digits = true,
symbols = true,
} = options;
let charset = '';
if (uppercase) charset += 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
if (lowercase) charset += 'abcdefghijklmnopqrstuvwxyz';
if (digits) charset += '0123456789';
if (symbols) charset += '!@#$%^&*()_+-=[]{}|;:,.<>?';
if (charset.length === 0) {
throw new Error('At least one character type must be enabled');
}
// Use crypto.getRandomValues for cryptographic security
const array = new Uint32Array(length);
crypto.getRandomValues(array);
let password = '';
for (let i = 0; i < length; i++) {
password += charset[array[i] % charset.length];
}
return password;
}
// Usage
console.log(generatePassword(16));
// Example output: "k9$Bm2!zYp@W7xQf"
console.log(generatePassword(20, { symbols: false }));
// Example output: "kR9mB2pTzY0WdXf7Qa4J"
// Calculate entropy
const poolSize = 95; // full ASCII
const length = 16;
const entropy = length * Math.log2(poolSize);
console.log(`Entropy: ${entropy.toFixed(1)} bits`);
// Output: "Entropy: 105.1 bits"Python(使用 secrets 模块)
import secrets
import string
import math
def generate_password(length=16, uppercase=True, lowercase=True,
digits=True, symbols=True):
"""Generate a cryptographically secure random password."""
charset = ''
if uppercase: charset += string.ascii_uppercase
if lowercase: charset += string.ascii_lowercase
if digits: charset += string.digits
if symbols: charset += string.punctuation
if not charset:
raise ValueError('At least one character type must be enabled')
# secrets.choice uses os.urandom (CSPRNG)
password = ''.join(secrets.choice(charset) for _ in range(length))
return password
def generate_passphrase(num_words=6, separator='-'):
"""Generate a Diceware-style passphrase."""
# In production, use a proper Diceware word list
# This is a simplified example
import pathlib
wordlist_path = '/usr/share/dict/words'
words = [w.strip().lower() for w in open(wordlist_path)
if 3 <= len(w.strip()) <= 8 and w.strip().isalpha()]
return separator.join(secrets.choice(words) for _ in range(num_words))
def password_entropy(password, pool_size):
"""Calculate password entropy in bits."""
return len(password) * math.log2(pool_size)
# Usage
pw = generate_password(16)
print(f"Password: {pw}")
print(f"Entropy: {password_entropy(pw, 95):.1f} bits")
pp = generate_passphrase(6)
print(f"Passphrase: {pp}")
# Example: "marble-tornado-pencil-silk-anchor-cloud"Warning: 关键:始终使用 crypto.getRandomValues()(JavaScript)或 secrets 模块(Python)。标准的 Math.random() 和 random.random() 不适合任何安全敏感用途。
在浏览器控制台快速生成密码
// Quick one-liner for browser console
// Generates a 20-char password with full ASCII
Array.from(crypto.getRandomValues(new Uint32Array(20)),
v => "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!@#$%^&*"[v % 72]
).join('')日常使用时,只需使用我们的在线密码生成器工具。
8. 密码短语 vs 密码:哪个更好?
密码短语是由多个随机选择的单词组成的密码。最著名的方法是 Diceware。
密码短语与随机密码对比
| 类型 | 示例 | 熵 | 可记忆性 |
|---|---|---|---|
| 16字符随机 | k9$Bm2!zYp@W7xQf | 105 位 | 很难记忆 |
| 4词密码短语 | correct horse battery staple | 51.7 位 | 容易记忆 |
| 6词密码短语 | pencil tornado marble silk anchor cloud | 77.5 位 | 中等难度 |
| 8词密码短语 | trophy canal wagon planet lemon oxide fern quartz | 103.4 位 | 较难记忆 |
何时使用密码短语:
- 密码管理器的主密码
- 全盘加密密码
- SSH 密钥密码短语
- 任何需要手动输入密码的场景
何时使用随机字符密码:
- 密码管理器管理的所有账户
- API 密钥和服务令牌
- 需要每字符最大熵时
关键洞察:密码短语牺牲熵密度换取可记忆性。两种方式都可以很安全。
# Entropy comparison: Passphrase vs Random Password
# ─────────────────────────────────────────────────────────────
# Type │ Characters │ Entropy │ Brute-force
# ──────────────────────┼────────────┼────────────┼────────────
# 4-word Diceware │ ~22 chars │ 51.7 bits │ ~71 years
# 6-word Diceware │ ~35 chars │ 77.5 bits │ ~4.7e15 yrs
# 8-word Diceware │ ~47 chars │ 103.4 bits │ ~3.2e23 yrs
# 12-char random ASCII │ 12 chars │ 78.8 bits │ ~9.5e15 yrs
# 16-char random ASCII │ 16 chars │ 105.1 bits │ ~1.3e24 yrs
# 20-char random ASCII │ 20 chars │ 131.4 bits │ ~1.1e31 yrs
# ─────────────────────────────────────────────────────────────
# (Assuming 100 billion hashes/sec with SHA-256)9. 密码管理器:密码生成器的必备搭档
随机密码生成器只有在你有办法存储和检索密码时才有用。这就是密码管理器的作用。
为什么你需要密码管理器:
- 普通人有 100+ 个在线账户,无法记住 100 个独特的随机密码。
- 密码管理器自动填充凭证,比手动输入更快更安全。
- 大多数密码管理器包含内置密码生成器。
- 密码管理器使用 Argon2id 或 PBKDF2 等算法加密你的保管库。
安全使用密码管理器的提示:
10. 双因素认证:必要的第二层防护
即使最强的密码也可能通过钓鱼、恶意软件或服务端泄露而被攻破。双因素认证添加了仅凭密码无法绕过的第二道验证。
2FA 方法安全性排名
| 方法 | 安全级别 | 优点 | 缺点 |
|---|---|---|---|
| 硬件密钥 (FIDO2/WebAuthn) | 最高 | 防钓鱼,无共享密钥 | 设备成本,可能丢失 |
| TOTP 应用 | 高 | 免费,离线可用 | 可被钓鱼 |
| 推送通知 | 高 | 易用 | 需要网络 |
| SMS 一次性代码 | 中等 | 通用 | SIM 卡交换攻击 |
| 电子邮件一次性代码 | 中低 | 无需应用 | 邮箱被攻破则失效 |
为获得最大安全性,使用 FIDO2 硬件密钥作为主要 2FA 方法,TOTP 应用作为备份。
开发者提示:实施 2FA 时,支持 WebAuthn/FIDO2 作为主要方法。它是唯一本质上防钓鱼的 2FA 方法。
11. 使用我们的在线密码生成器
我们的免费在线密码生成器直接在浏览器中创建密码学安全的随机密码。不会向任何服务器发送密码。
- 可配置 4 到 128 字符的长度
- 独立切换大写、小写、数字和符号
- 排除易混淆字符(0/O, 1/l/I)
- 实时熵计算和强度指示器
- 一键复制到剪贴板
- 完全在浏览器中运行,无服务器通信