密码生成器

生成强随机密码,支持自定义长度和字符集

长度20
数量5

什么是密码生成器?

密码生成器用于创建随机字符串,作为用户账户、API 密钥、数据库凭据和加密密钥的密码。与人工选择的密码不同,生成的密码取自所有可能字符组合的完整空间,能有效抵御字典攻击和基于模式的猜测。本工具直接在浏览器中使用内置的加密随机数生成器,在线生成强随机密码。

密码强度取决于两个因素:长度和字符多样性。一个包含大写字母、小写字母、数字和符号的20位密码大约具有131比特的熵。在这一级别,即使攻击者每秒尝试一万亿次猜测,穷举所有组合所需的时间也将超过宇宙的年龄。计算方法很直接:熵 = 长度 × log2(字符集大小)。

NIST SP 800-63B 等标准建议密码长度至少为8个字符,且验证方不应设置长度上限,并不鼓励强制组合规则(如要求恰好包含一个符号),而是推荐使用更长的密码短语。对于机器间通信凭据和服务账户,在大多数安全框架和合规要求中,从完整字符集中随机生成20个或更多字符已是公认的基准。

为什么使用密码生成器?

人类并不擅长生成随机数。我们会重复使用密码、选择字典词汇、用可预测的模式替换字母(如用@代替a、用3代替e),并倾向于使用较短的字符串。密码生成器能从根本上消除这种人为偏差。

🔐
隐私优先生成
密码完全在浏览器中使用 Web Crypto API 生成。没有任何字符会离开您的设备,不记录任何日志,生成过程中也不发送任何网络请求。
即时批量输出
单次点击最多可生成20个密码。可单独复制某个密码,也可一次性全部复制,方便用于部署脚本或凭据管理库。
🛡️
无需账户
无需注册、无需邮箱、不使用Cookie跟踪您生成的密码。打开页面,配置选项,直接生成。
🎛️
完整的字符集控制
可独立启用或禁用大写字母、小写字母、数字和符号。长度可设置为4到128个字符,以满足任何系统或策略的要求。

密码生成器使用场景

前端开发
为表单验证、输入长度测试和身份验证流程开发生成测试密码。验证登录表单能否正确处理128位密码和特殊字符。
后端与 DevOps
在基础设施搭建过程中创建数据库凭据、API 令牌和服务账户密码。使用批量生成功能在单次会话中为多个服务配置凭据。
安全工程
为加密密钥、HMAC 签名和 JWT 密钥轮换生成高熵密钥。将长度设置为64位以上,以满足超过256比特熵的密钥需求。
QA 与渗透测试
通过生成包含或排除特定字符集的字符串来测试密码策略执行情况。验证系统能否正确拒绝低于最小长度或复杂度要求的密码。
数据工程
为测试环境、预发布数据库和 CI/CD 流水线密钥生成随机凭据。避免在测试数据中复用生产密码,为每个环境单独生成新凭据。
个人账户安全
为每个在线账户创建唯一密码。将本工具与密码管理器配合使用,以存储无需记忆的凭据。

密码熵参考

熵衡量密码的不可预测性,计算方式为 log2(字符集大小 ^ 长度)。熵越高,攻击者需要搜索的可能组合就越多。NIST 和 OWASP 建议高安全性应用至少达到80比特的熵。

长度字符集暴力破解时间
8lower + digits~41 bitsMinutes to hours
12lower + upper + digits~71 bitsCenturies (offline)
16all character sets~105 bitsBeyond brute-force
20all character sets~131 bitsBeyond brute-force
32all character sets~210 bitsBeyond brute-force
64all character sets~419 bitsBeyond brute-force

破解时间假设每秒猜测1万亿次(使用现代GPU进行离线攻击)。有频率限制的在线攻击速度要慢几个数量级。

CSPRNG 与 Math.random() 的密码生成对比

随机性来源与密码长度同样重要。使用可预测随机数生成器生成的密码,可能被了解算法和种子状态的攻击者重建。本工具使用 crypto.getRandomValues(),这是内置于每个现代浏览器中的密码学安全伪随机数生成器(CSPRNG)。

crypto.getRandomValues()
使用操作系统的熵源(硬件随机数生成器、中断时序等)。即使攻击者知道所有先前的输出,结果仍不可预测。W3C Web Crypto 规范要求将其用于安全敏感操作。
Math.random()
使用从有限熵池中播种的确定性算法。如果种子状态已知,输出可被预测。ECMAScript 规范明确指出 Math.random() 不提供密码学安全的随机数。切勿将其用于密码生成。

代码示例

在不同编程语言中以编程方式生成密码。以下所有示例均使用密码学安全的随机源,而非 Math.random() 或同等的弱伪随机数生成器。

JavaScript (Web Crypto API)
// Generate a random password in the browser or Node.js 19+
function generatePassword(length = 20) {
  const charset = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!@#$%^&*'
  const values = new Uint32Array(length)
  crypto.getRandomValues(values)
  return Array.from(values, v => charset[v % charset.length]).join('')
}

console.log(generatePassword())    // → "kR7!mZp$Xw2&nLq9@Yf3"
console.log(generatePassword(32))  // → "Hd4%tNx!Qw8#mKp2Rv6&Zj0*Ls3Yb7@"
Python
import secrets
import string

def generate_password(length: int = 20) -> str:
    """Generate a cryptographically secure random password."""
    alphabet = string.ascii_letters + string.digits + string.punctuation
    return ''.join(secrets.choice(alphabet) for _ in range(length))

# Single password
print(generate_password())      # → "kR7!mZp$Xw2&nLq9@Yf3"

# Batch of 5 passwords
for _ in range(5):
    print(generate_password(24))

# Ensure at least one char from each category
def generate_strong(length: int = 20) -> str:
    required = [
        secrets.choice(string.ascii_uppercase),
        secrets.choice(string.ascii_lowercase),
        secrets.choice(string.digits),
        secrets.choice(string.punctuation),
    ]
    remaining = length - len(required)
    alphabet = string.ascii_letters + string.digits + string.punctuation
    all_chars = required + [secrets.choice(alphabet) for _ in range(remaining)]
    secrets.SystemRandom().shuffle(all_chars)
    return ''.join(all_chars)
CLI (OpenSSL / /dev/urandom)
# OpenSSL — generate 32 random bytes, base64-encode
openssl rand -base64 32
# → "x7Kp2mNqR4wZ8vLs1Yb0Hd6tFj3Xc9Ga5eUi+Wo="

# /dev/urandom with tr — alphanumeric + symbols, 20 chars
tr -dc 'A-Za-z0-9!@#$%^&*' < /dev/urandom | head -c 20; echo
# → "kR7!mZp$Xw2&nLq9@Yf3"

# pwgen (install: apt install pwgen / brew install pwgen)
pwgen -sy 20 5
# Generates 5 passwords, 20 chars each, with symbols
Go
package main

import (
    "crypto/rand"
    "fmt"
    "math/big"
)

func generatePassword(length int) (string, error) {
    charset := "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!@#$%^&*()"
    result := make([]byte, length)
    for i := range result {
        idx, err := rand.Int(rand.Reader, big.NewInt(int64(len(charset))))
        if err != nil {
            return "", err
        }
        result[i] = charset[idx.Int64()]
    }
    return string(result), nil
}

func main() {
    pwd, _ := generatePassword(20)
    fmt.Println(pwd) // → "kR7!mZp$Xw2&nLq9@Yf3"
}

常见问题

密码应该多长?
对于用户账户,使用混合字符集的16位密码可提供超过100比特的熵,足以应对当前所有威胁模型。对于机器密钥(API 密钥、加密密钥),建议使用32位或更长。NIST SP 800-63B 设定最低为8个字符,但建议系统允许更长的密码且不进行截断。
这个密码生成器安全吗?
安全。密码在浏览器中使用 Web Crypto API(crypto.getRandomValues)生成,不会向任何服务器发送数据。您可以打开浏览器的网络面板,在点击生成时观察是否有请求发出来验证这一点。源代码是客户端 JavaScript,可在浏览器开发者工具中查看。
什么是密码熵?
熵是以比特表示的随机性度量。具有N比特熵的密码有2^N个可能的值。例如,从95个可打印 ASCII 字符中生成的20位密码,其熵为 log2(95^20) = 131.1 比特。每增加一比特,攻击者需要猜测的次数就翻倍。
密码中应该包含符号吗?
包含符号可将字符集从62(字母+数字)扩大到95(可打印 ASCII),每个字符约增加6.1比特的熵。部分系统会限制允许使用的符号。如果某系统拒绝特定符号,可禁用符号选项并通过增加密码长度来补偿。24位纯字母数字密码的熵高于16位含符号的密码。
为什么不能用 Math.random() 生成密码?
Math.random() 不具备密码学安全性。大多数 JavaScript 引擎使用 xorshift128+ 或类似的快速伪随机数生成器实现,这类生成器专为模拟和游戏设计,而非安全用途。攻击者只需观察少量输出,即可恢复内部状态并预测所有后续输出。Web Crypto API 使用操作系统的熵源,其输出不可预测。
生成的密码可以用作 API 密钥和令牌吗?
可以,但需考虑目标系统的格式要求。部分 API 期望使用 base64 编码的密钥或十六进制字符串,而非任意字符。对于原始密钥生成,使用完整字符集生成32位以上的密码。对于 base64 密钥,应单独生成随机字节并进行编码,而非将 base64 视为密码字符集。
密码应该多久轮换一次?
NIST SP 800-63B(2017年,2024年更新)不建议对用户密码强制定期轮换,因为这会导致用户选择更弱的密码。仅在有被攻击证据时才进行轮换。对于机器密钥和服务账户,应根据组织的风险模型决定轮换周期,高权限凭据通常每90天轮换一次。