secrets
---生成安全随机数管理秘密¶
3.6 新版功能.
源代码: Lib/secrets.py
这个 secrets
模块用于生成加密强随机数,适用于管理密码、帐户验证、安全令牌和相关机密等数据。
特别地, secrets
应该优先使用默认的伪随机数生成器 random
模块,设计用于建模和模拟,而不是安全或加密。
参见
随机数¶
这个 secrets
模块提供对操作系统提供的最安全的随机性源的访问。
- class secrets.SystemRandom¶
使用操作系统提供的最高质量源生成随机数的类。见
random.SystemRandom
更多细节。
- secrets.choice(sequence)¶
从非空序列返回随机选择的元素。
- secrets.randbelow(n)¶
返回范围[0, n )
- secrets.randbits(k)¶
返回int k 随机位。
生成令牌¶
这个 secrets
模块提供生成安全令牌的功能,适用于密码重置、难以猜测的URL等应用程序。
- secrets.token_bytes([nbytes=None])¶
返回包含 字节数 字节数。如果 字节数 是
None
或未提供,则使用合理违约。>>> token_bytes(16) b'\xebr\x17D*t\xae\xd4\xe3S\xb6\xe2\xebP1\x8b'
- secrets.token_hex([nbytes=None])¶
返回十六进制的随机文本字符串。字符串有 字节数 随机字节,每个字节转换为两个十六进制数字。如果 字节数 是
None
或未提供,则使用合理违约。>>> token_hex(16) 'f9bf78b9a18ce6d46a0cd2b0b86df9da'
- secrets.token_urlsafe([nbytes=None])¶
返回一个随机的URL安全文本字符串,其中包含 字节数 随机字节。文本是base64编码的,因此平均每个字节产生大约1.3个字符。如果 字节数 是
None
或未提供,则使用合理违约。>>> token_urlsafe(16) 'Drmhze6EPcv0fN_81Bj-nA'
令牌应该使用多少字节?¶
以防 brute-force attacks ,令牌需要具有足够的随机性。不幸的是,当计算机变得更强大,能够在更短的时间内做出更多的猜测时,被认为足够的东西必然会增加。截至2015年,据信32字节(256位)的随机性足以满足 secrets
模块。
对于那些想要管理自己的令牌长度的人,可以通过给出一个 int
各种各样的参数 token_*
功能。这个参数被认为是随机使用的字节数。
否则,如果没有提供参数,或者参数是 None
, the token_*
函数将使用合理的默认值。
注解
该默认值随时可能更改,包括在维护发布期间。
其他功能¶
- secrets.compare_digest(a, b)¶
返回
True
如果字符串 a 和 b 相等,否则False
以降低 timing attacks . 见hmac.compare_digest()
更多细节。
配方和最佳实践¶
本节介绍使用的配方和最佳实践 secrets
管理基本的安全级别。
生成八个字符的字母数字密码:
import string
import secrets
alphabet = string.ascii_letters + string.digits
password = ''.join(secrets.choice(alphabet) for i in range(8))
注解
应用程序不应 store passwords in a recoverable format ,无论是纯文本还是加密。它们应该使用一个加密的强单向(不可逆)散列函数进行加盐和散列。
生成具有至少一个小写字符、至少一个大写字符和至少三个数字的十字符字母数字密码:
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
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()