secrets生成用于管理机密的安全随机数(3)Python加密处理(必读进阶Python教程)(参考资料)
该secrets
模块用于生成适用于管理密码,帐户认证,安全令牌和相关机密等数据的加密强随机数。
特别是,secrets
应该优先使用模块中的默认伪随机数生成器random
,它是为建模和模拟而设计的,而不是安全性或加密。
也可以看看
PEP 506
随机数
该secrets
模块提供对操作系统提供的最安全的随机源的访问。
- 类
secrets.
SystemRandom
- 使用操作系统提供的最高质量源生成随机数的类。请参阅
random.SystemRandom
其他详细信息。
secrets.
choice
(序列)- 从非空序列中返回随机选择的元素。
secrets.
randbelow
(n )- 返回[0,n ] 范围内的随机int 。
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'
令牌使用多少字节?
为了抵御 暴力攻击,令牌需要具有足够的随机性。不幸的是,随着计算机变得更强大并且能够在更短的时间内做出更多的猜测,被认为足够的东西必然会增加。从2015年开始,据信32字节(256位)的随机性足以满足secrets
模块预期的典型用例。
对于那些想要管理自己的令牌长度的人,您可以通过为int
各种token_*
函数提供参数来明确指定用于令牌的随机性。该参数被视为要使用的随机字节数。
否则,如果没有提供参数,或者参数是None
,则token_*
函数将使用合理的默认值。
注意
该默认值可随时更改,包括在维护版本期间。
其他功能
secrets.
compare_digest
(a,b )True
如果字符串a和b相等则返回,否则False
,以降低定时攻击的风险 。请参阅hmac.compare_digest()
其他详细信息。
食谱和最佳实践
本节介绍用于secrets
管理基本安全级别的配方和最佳实践。
生成八个字符的字母数字密码:
import string
alphabet = string.ascii_letters + string.digits
password = ''.join(choice(alphabet) for i in range(8))
注意
应用程序不应 以可恢复的格式存储密码,无论是纯文本还是加密格式。它们应该使用加密强大的单向(不可逆)散列函数进行加盐和散列。
生成一个十个字符的字母数字密码,至少包含一个小写字符,至少一个大写字符和至少三个数字:
import string
alphabet = string.ascii_letters + string.digits
while True:
password = ''.join(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样式的密码:
# 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(choice(words) for i in range(4))
生成一个难以猜测的临时URL,其中包含适用于密码恢复应用程序的安全令牌:
url = 'https://mydomain.com/reset=' + token_urlsafe()