secrets — 生成用于管理机密的安全随机数 — Python 文档
来自菜鸟教程
Python/docs/3.9/library/secrets
secrets — 生成用于管理机密的安全随机数
3.6 版中的新功能。
secrets 模块用于生成加密强随机数,适用于管理密码、帐户身份验证、安全令牌和相关机密等数据。
特别是,secrets 应该优先于 random 模块中的默认伪随机数生成器,该模块是为建模和模拟而设计的,而不是安全性或密码学。
随机数
secrets 模块提供对操作系统提供的最安全的随机源的访问。
- class secrets.SystemRandom
- 使用操作系统提供的最高质量源生成随机数的类。 有关其他详细信息,请参阅 random.SystemRandom。
- secrets.choice(sequence)
- 从非空序列中返回一个随机选择的元素。
- secrets.randbelow(n)
- 返回 [0, n) 范围内的随机整数。
- secrets.randbits(k)
- 返回一个带有 k 随机位的 int。
生成令牌
secrets 模块提供了生成安全令牌的功能,适用于密码重置、难以猜测的 URL 等应用。
- secrets.token_bytes([nbytes=None])
返回包含 nbytes 个字节的随机字节字符串。 如果 nbytes 是
None
或未提供,则使用合理的默认值。>>> token_bytes(16) b'\xebr\x17D*t\xae\xd4\xe3S\xb6\xe2\xebP1\x8b'
- secrets.token_hex([nbytes=None])
以十六进制返回随机文本字符串。 该字符串具有 nbytes 个随机字节,每个字节转换为两个十六进制数字。 如果 nbytes 是
None
或未提供,则使用合理的默认值。>>> token_hex(16) 'f9bf78b9a18ce6d46a0cd2b0b86df9da'
- secrets.token_urlsafe([nbytes=None])
返回一个随机的 URL 安全文本字符串,包含 nbytes 个随机字节。 文本是 Base64 编码的,因此平均每个字节产生大约 1.3 个字符。 如果 nbytes 是
None
或未提供,则使用合理的默认值。>>> token_urlsafe(16) 'Drmhze6EPcv0fN_81Bj-nA'
其他功能
- secrets.compare_digest(a, b)
- 如果字符串 a 和 b 相等,则返回
True
,否则返回False
,以降低 定时攻击的风险。 有关其他详细信息,请参阅 hmac.compare_digest()。
食谱和最佳实践
本节展示了使用 secrets 管理基本安全级别的秘诀和最佳实践。
生成八位字母数字密码:
import string
import secrets
alphabet = string.ascii_letters + string.digits
password = ''.join(secrets.choice(alphabet) for i in range(8))
生成包含至少一个小写字符、至少一个大写字符和至少三位数字的十个字符的字母数字密码:
import string
import secrets
alphabet = string.ascii_letters + string.digits
while True:
password = ''.join(secrets.choice(alphabet) for i in range(10))
if (any(c.islower() for c in password)
and any(c.isupper() for c in password)
and sum(c.isdigit() for c in password) >= 3):
break
生成 XKCD 风格的密码短语 :
import secrets
# On standard Linux systems, use a convenient dictionary file.
# Other platforms may need to provide their own word-list.
with open('/usr/share/dict/words') as f:
words = [word.strip() for word in f]
password = ' '.join(secrets.choice(words) for i in range(4))
生成一个难以猜测的临时 URL,其中包含适用于密码恢复应用程序的安全令牌:
import secrets
url = 'https://mydomain.com/reset=' + secrets.token_urlsafe()