secrets 是 Python 3.6+ 引入的标准库模块,专为生成密码学安全的随机数、令牌和密码而设计。它在底层使用操作系统提供的高质量随机源(如 /dev/urandom 或 Windows 的 CryptGenRandom),适用于身份验证、密钥生成、验证码、口令管理等安全敏感场景。
常见应用场景:
(1)生成随机密码、验证码、密钥(key)。
(2)创建唯一令牌(如用户登录 token)。
(3)生成不可预测的 URL 安全字符串(适合邮箱验证、重置链接等)。
(4)随机选择安全选项(如加密中使用的算法)。
◆ ◆ ◆
核心概念
1、加密安全随机生成
相比 random 模块,secrets 使用的是更适合安全场景的加密强度随机源。
2、专用于敏感数据生成
不适合用于普通模拟或游戏用途(请用 random 模块)。
3、支持二进制和字符串格式的令牌
如 token_bytes()、token_hex()、token_urlsafe(),可适应不同需求。
4、安全选择与密码构造
提供 choice() 方法安全地从字符集中选取字符,适合构建密码或口令。
◆ ◆ ◆
应用举例
例 1:生成随机安全整数(在给定范围内)
apache
import secrets
rand_num = secrets.randbelow(100) # 生成 0~99 的随机整数print("安全随机整数:", rand_num)
例 2:生成随机 URL 安全的令牌
java
import secrets
token = secrets.token_urlsafe(16)print("URL 安全的随机令牌:", token)
例 3:从字符集中安全选择一个字符(如密码生成)
go
import secretsimport string
all_chars = string.ascii_letters + string.digitspassword = ''.join(secrets.choice(all_chars) for _ in range(12))print("安全生成的密码:", password)
例 4:使用 token_bytes() 生成二进制密钥(用于加密)
python
import secrets
key = secrets.token_bytes(32) # 生成 256-bit 密钥print("生成的二进制密钥:", key.hex())
例 5:生成唯一邀请码(避免重复)
python
import secrets
invite_code = secrets.token_hex(6) # 生成 12 位十六进制邀请码print("邀请码:", invite_code)
◆ ◆ ◆
常用函数速览
secrets.choice(sequence)
从序列中安全随机选择一个元素。
参数:
sequence:非空序列(如字符串、列表等)
返回:随机选中的元素
secrets.compare_digest(a, b)
安全比较两个字符串或字节,防止时序攻击。
参数:
a, b:要比较的对象(str 或 bytes)
返回:bool,相同为 True
secrets.randbelow(n)
返回小于 n 的非负随机整数。
参数:
n:正整数上限
返回:int
secrets.randbits(k)
返回一个具有 k 位随机二进制数的整数。
参数:
k:位数(整数)
返回:int
secrets.token_bytes(nbytes=None)
生成安全的随机字节串。
参数:
nbytes:要生成的字节数,默认 32
返回:bytes
secrets.token_hex(nbytes=None)
生成安全的随机十六进制字符串。
参数:
nbytes:对应生成多少字节(每字节 = 2 位十六进制字符),默认 32
返回:str(如 '9f8c7a6d...')
secrets.token_urlsafe(nbytes=None)
生成 URL 安全的 Base64 编码字符串(适合链接使用)。
参数:
nbytes:原始字节数,默认 32
返回:str,适合 URL 传输的 token
◆ ◆ ◆
补充说明
1、secrets 是生成敏感数据(如密码或 token)的首选模块,请勿使用 random 生成密码。
2、secrets.choice() 可替代 random.choice(),用于更安全的场景。
3、token_urlsafe() 生成的字符串包含 A-Z, a-z, 0-9, -, _,可以安全嵌入 URL。

"点赞有美意,赞赏是鼓励"