DevToolBox免费
博客

在线密码生成器:如何创建强大、安全、随机的密码

15 分钟阅读作者 DevToolBox

在每年有数十亿凭证在数据泄露中曝光的世界里,为每个账户使用强大、唯一的密码已不再是可选项。然而,大多数人仍然依赖弱密码和重复使用的密码,攻击者可以在几秒内破解。随机密码生成器消除了人类偏见,创建能够抵抗暴力破解、字典攻击和彩虹表攻击的密码学强密码。本综合指南涵盖了生成安全密码所需的一切知识。

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)103.327291048365
小写字母 (a-z)264.70qmxbftzdkw
大小写 (A-Za-z)525.70kRmBpTzYdW
字母数字 (A-Za-z0-9)625.95k9mB2TzY0W
完整 ASCII 可打印956.57k9$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 old

3. 什么使密码变得强大

强密码有三个基本属性:长度、随机性和唯一性。复杂性(混合字符类型)有帮助但次要于这三个属性。

长度是最重要的因素

每增加一个字符,搜索空间乘以字符池大小。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)1025 字符31 字符
小写 (a-z)2618 字符22 字符
字母数字6214 字符17 字符
完整 ASCII9513 字符16 字符

最佳实践:使用完整 ASCII 字符集加 16 字符以上,可达到 105+ 位熵。

5. NIST 2024 密码指南:有什么变化

NIST 更新了其数字身份指南(SP 800-63B),反映了对密码安全的现代理解。

1
最少 8 字符,建议 15+

NIST 设定 8 字符为绝对下限,但明确表示应鼓励更长的密码。

2
允许最多 64+ 字符

密码字段必须接受至少 64 个字符。截断密码被明确禁止。

3
无组合规则

不再建议要求大写、小写、数字和符号。

4
不强制定期轮换

只有在有泄露证据时才应更改密码。

5
检查泄露数据库

设置或更改密码时,系统必须检查已知泄露密码列表。

6
允许密码字段粘贴

阻止密码字段粘贴会积极损害安全性。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 years

7. 以编程方式生成密码

如果你需要在应用中生成密码,必须使用密码学安全随机数生成器(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@W7xQf105 位很难记忆
4词密码短语correct horse battery staple51.7 位容易记忆
6词密码短语pencil tornado marble silk anchor cloud77.5 位中等难度
8词密码短语trophy canal wagon planet lemon oxide fern quartz103.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 等算法加密你的保管库。

安全使用密码管理器的提示:

1选择 5-6 个 Diceware 词的主密码。
2在密码管理器账户上启用双因素认证。
3设置紧急访问。
4定期运行内置安全审计。
5永远不要以数字方式存储主密码。

10. 双因素认证:必要的第二层防护

即使最强的密码也可能通过钓鱼、恶意软件或服务端泄露而被攻破。双因素认证添加了仅凭密码无法绕过的第二道验证。

2FA 方法安全性排名

方法安全级别优点缺点
硬件密钥 (FIDO2/WebAuthn)最高防钓鱼,无共享密钥设备成本,可能丢失
TOTP 应用免费,离线可用可被钓鱼
推送通知易用需要网络
SMS 一次性代码中等通用SIM 卡交换攻击
电子邮件一次性代码中低无需应用邮箱被攻破则失效

为获得最大安全性,使用 FIDO2 硬件密钥作为主要 2FA 方法,TOTP 应用作为备份。

开发者提示:实施 2FA 时,支持 WebAuthn/FIDO2 作为主要方法。它是唯一本质上防钓鱼的 2FA 方法。

11. 使用我们的在线密码生成器

我们的免费在线密码生成器直接在浏览器中创建密码学安全的随机密码。不会向任何服务器发送密码。

  • 可配置 4 到 128 字符的长度
  • 独立切换大写、小写、数字和符号
  • 排除易混淆字符(0/O, 1/l/I)
  • 实时熵计算和强度指示器
  • 一键复制到剪贴板
  • 完全在浏览器中运行,无服务器通信
试用密码生成器工具

常见问题

2024-2025 年密码应该多长?
对于随机生成的密码,16 个字符混合字符类型提供超过 105 位熵。NIST SP 800-63B 要求最少 8 字符但建议更长。对于密码短语,5-6 个随机词提供可比的安全性。如果使用密码管理器,没有理由不使用 16-20 字符的随机密码。
在线使用随机密码生成器安全吗?
使用 Web Crypto API 的良好在线密码生成器完全在浏览器中生成密码,永远不会离开你的设备。你可以通过浏览器开发者工具的网络标签来验证。
随机密码和密码短语有什么区别?
随机密码使用随机选择的单个字符,如 "k9$Bm2!zYp@W"。密码短语使用随机选择的完整单词,如 "pencil tornado marble silk"。用密码管理器时用随机密码,需要记忆时用密码短语。
我应该多久更改一次密码?
根据 NIST SP 800-63B(2024),不应按固定时间表更改密码。只有在有具体原因时才更改:怀疑泄露、出现在泄露数据库中、或服务报告安全事件。
量子计算机能破解我的密码吗?
量子计算机的 Grover 算法可将密码的有效熵减半。16 字符完整 ASCII 密码仍有约 52 位量子安全性。实用的大规模量子计算机仍在数年之后。
我应该在密码中使用特殊字符吗?
如果密码是随机生成的,包含特殊字符将字符池从 62 增加到 95,每字符增加约 0.62 位熵。16 字符大约多 10 位熵。所以是的,包含它们。但长度始终比复杂性更重要。
最强的密码是什么?
最强的密码是:尽可能长(最多 64-128 字符)、使用所有可用字符类型、由 CSPRNG 生成、每个账户唯一、存储在加密的密码管理器中。实际上,20 字符的完整 ASCII 随机密码(131 位熵)超过了 128 位 AES 加密密钥的安全级别。
密码生成器比自己编密码好吗?
是的,明显更好。研究一致表明人类选择的密码有效熵远低于其长度和字符集所暗示的。随机生成器消除所有人类偏见,达到理论最大熵。

立即生成安全密码

使用我们免费的在线密码生成器创建密码学安全的随机密码,完全在浏览器中运行。

试用密码生成器工具
𝕏 Twitterin LinkedIn
这篇文章有帮助吗?

保持更新

获取每周开发技巧和新工具通知。

无垃圾邮件,随时退订。

试试这些相关工具

🔑Password Generator#Hash Generator🔒Bcrypt Hash Generator

相关文章

2025 年密码强度要求:NIST 指南与最佳实践

基于 NIST SP 800-63B 的现代密码强度要求。最小长度、复杂度规则、黑名单、MFA 以及与旧做法的变化。

bcrypt vs Argon2 vs scrypt:2026 密码哈希对比

对比 bcrypt、Argon2id 和 scrypt 密码哈希。基准测试、安全分析、5 种语言代码示例和 OWASP 推荐。

SSH Keygen:Ed25519 vs RSA 完全指南

学习使用 ssh-keygen 生成 SSH 密钥。比较 Ed25519 和 RSA,了解密钥大小和 SSH 密钥管理最佳实践。