我的知识记录

Python 随机生成密码:secrets 安全随机密码生成器

用 Python secrets 模块生成高安全随机密码,支持指定长度、大小写、数字、符号、排除易混淆字符,适合批量生成账号初始密码。

场景痛点

测试环境要批量建账号、给客户分配初始密码、开发接口要测试 token,手动想密码又弱又重复。用 random 模块生成的密码在安全场景不够稳,因为它是伪随机、可预测。Python 3.6 以后标准库提供 secrets 模块,专门做加密级随机数,生成的密码才够安全。

用到的库

# 标准库 secrets, string,不需要安装

完整代码

import secrets
import string


def generate_password(length=16, use_upper=True, use_digits=True, use_symbols=True):
"""生成指定强度的随机密码"""
lower = string.ascii_lowercase
upper = string.ascii_uppercase if use_upper else ""
digits = string.digits if use_digits else ""
# 去掉容易混淆的字符:0 O, 1 l I
symbols = "!@#$%^&*()-_=+[]{}" if use_symbols else ""
alphabet = lower + upper + digits + symbols
if not alphabet:
raise ValueError("至少选一种字符集")

# 保证每种字符集至少出现一次
must = []
if use_upper:
must.append(secrets.choice(upper))
if use_digits:
must.append(secrets.choice(digits))
if use_symbols:
must.append(secrets.choice(symbols))
must.append(secrets.choice(lower))

# 剩余位置从全字符集随机取
remaining = [secrets.choice(alphabet) for _ in range(length - len(must))]
pwd_chars = must + remaining
# 打乱顺序,防止开头固定是大写
secrets.SystemRandom().shuffle(pwd_chars)
return "".join(pwd_chars)


def generate_pin(length=6):
"""生成纯数字 PIN,比如支付密码"""
return "".join(secrets.choice(string.digits) for _ in range(length))


def generate_batch(count=10, length=16):
"""批量生成密码并打印"""
print(f"生成 {count} 个 {length} 位密码:")
for i in range(count):
print(f"{i+1:>3}. {generate_password(length)}")


def main():
generate_batch(count=10, length=16)
print("-" * 40)
print("6 位数字 PIN:", generate_pin(6))


if __name__ == "__main__":
main()

代码讲解

  • secrets 是 Python 3.6+ 标准库,使用操作系统提供的随机源(Linux 的 /dev/urandom、Windows 的 CryptGenRandom),适合做密码、token、密钥这种安全场景。
  • string.ascii_lowercase 是所有小写字母,string.digits 是 0-9,直接拼字符集。
  • secrets.choice(alphabet) 从字符集里随机挑一个,比 random.choice 更安全。
  • 先从每种必选字符集里各抽一个,保证密码一定包含大写、数字、符号,再用全字符集补齐剩余长度,最后 shuffle 打乱,避免开头固定格式。
  • generate_pin 生成纯数字短码,适合短信验证码、支付密码。

运行结果

运行后打印 10 个 16 位随机密码,每个都包含大小写字母、数字、符号,比如 kP9#mX2vL!nQ7rZ@;最后再生成一个 6 位数字 PIN。把结果复制到 Excel 或账号表里发下去。

注意事项

  • 不要用 random 模块生成安全密码,它的种子可预测,密码学场景会被破解。
  • 密码长度建议至少 12 位,16 位以上在今天才算安全;纯数字 PIN 最多 6 位,再多用户记不住。
  • 有些系统不允许特殊字符,跑前先确认目标系统的密码规则,把 use_symbols 关掉或换符号表。
  • 生成的密码打印在控制台有泄露风险,批量场景直接写文件、文件权限设成 600,跑完删掉。
  • 把易混淆字符 O0lI1 从字符集里去掉,用户输入时不容易看错。

Python 随机生成密码:secrets 安全随机密码生成器

标签:

更新时间:2026-09-14 20:39:09

上一篇:Python 批量生成随机姓名手机号测试数据:导出 CSV

下一篇:Python 生成二维码图片:qrcode 库入门与自定义样式