secrets模块是python 3.6+专为密码学安全随机数设计的标准库,比random更可靠;推荐用token_urlsafe(32)生成url安全令牌,choice()配合大字符表生成强密码,token_hex(16)用于十六进制场景,salt应由哈希函数自动生成而非手动处理。

secrets 模块是 Python 3.6+ 中专为密码学安全随机数设计的标准库,它比 random 模块更可靠——random 基于 Mersenne Twister,可预测,**绝不能用于生成令牌或密码**。
生成 URL 安全的随机令牌(如 API key、session ID)
用 secrets.token_urlsafe() 最省心:它返回 Base64 URL 安全编码的字符串(只含 A–Z、a–z、0–9、- 和 _),无需额外过滤,可直接用于 HTTP 头、URL 参数或数据库存储。
注意长度参数是「字节长度」,不是最终字符串长度。例如 secrets.token_urlsafe(32) 生成约 43 字符的字符串(因为 Base64 编码会膨胀)。
常见错误:传入过小的字节数。NIST 建议密钥材料至少 32 字节熵,所以别用 token_urlsafe(16)。
示例:
import secrets api_key = secrets.token_urlsafe(32) # 推荐最小值
生成固定字符集的密码(如用户注册密码)
用 secrets.choice() 配合自定义字符表,避免使用易混淆字符(如 0/O/l/1/I)。
关键点:字符表必须足够大(≥ 64 字符),且不含重复或视觉相似字符;每次调用 secrets.choice() 是独立安全采样,但循环次数必须明确指定长度。
不要用 random.choices() 替代,它不安全;也不要手动拼接 secrets.randbelow() 查表——容易索引越界或逻辑错乱。
示例(生成 12 位强密码):
图片提示词生成器?不止如此。 马甲系统 —— 把脑海中的画面,翻译成AI能理解的专业表达。 用得越多,它越懂你:首次需要多问几句确认方向,用久了几乎一说就懂。 用得越多,它越快:缓存机制让后续对话越来越省。 RAG进化:成功案例持续入库,越跑越聪明。 输入「新手指南」查看完整功能介绍
import secrets alphabet = "ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz23456789" password = ''.join(secrets.choice(alphabet) for _ in range(12))
生成十六进制令牌(如数据库 token 字段)
secrets.token_hex(n) 返回 n 字节对应的十六进制字符串(长度为 2*n)。适合需要定长、纯数字字母、无特殊符号的场景(如 Redis 键名、SQL 表字段)。
常见误区:误以为 token_hex(16) 和 token_urlsafe(16) 安全性相同——其实前者熵更低(16 字节 = 128 bit),后者等效熵更高(因 Base64 编码效率更高),但两者都满足常规安全需求。
兼容性注意:Hex 字符串只含 0–9 和 a–f,对大小写不敏感,某些旧系统可能默认转小写,需统一约定。
示例:
import secrets db_token = secrets.token_hex(16) # 32 字符小写 hex
避免用 secrets 生成 salt 的常见误操作
虽然 secrets.token_bytes() 可生成 salt,但多数哈希函数(如 bcrypt、scrypt、pbkdf2_hmac)内部已封装 salt 生成逻辑,**你只需调用它们的高层接口**(如 bcrypt.hashpw()),无需手动管理 salt。
手动 salt 的典型错误:
- 用
secrets.token_urlsafe()生成 salt 后再转 bytes,引入不必要的编码开销 - 把 salt 当作 secret 存储(salt 应公开,和 hash 一起存)
- 重复使用同一 salt 处理多个密码(每个密码必须独享 salt)
真正该用 secrets.token_bytes() 的地方,是实现自定义哈希流程或加密 nonce(如 AES-GCM)。
真正难的是选对函数和参数——token_urlsafe() 不是“看起来更酷”,而是它绕过了编码歧义、URL 转义、大小写归一化等实际部署中高频出问题的环节。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










