在前面的概念中,我们讨论过 random 模块,它可以生成伪随机数和伪随机的数组顺序。
secrets模块在部分功能上与random有重叠,但这两个模块的设计侧重点截然不同。
random为建模和仿真中的高性能做了优化,其伪随机数生成“足够好”。secrets的设计目标是密码学安全,适用于密码哈希、安全令牌生成和账户身份验证等应用。关于为什么有必要新增secrets模块,更多细节请参见 PEP 506。
secrets模块相对小巧,用法也很直接,提供了生成随机整数、比特、字节、令牌,或从给定序列中随机取一项的方法。
要使用secrets,你必须先import它:
>>> import secrets
# Returns n, where 0 <= n < 1000.
>>> secrets.randbelow(1000)
577
# 32-bit integers.
>>> secrets.randbits(32)
3028709440
>>> bin(secrets.randbits(32))
'0b11111000101100101111110011110100'
# Pick at random from a sequence.
>>> secrets.choice(['my', 'secret', 'thing'])
'thing'
# Generate a token made up of random hexadecimal digits.
>>> secrets.token_hex()
'f683d093ea9aa1f2607497c837cf11d7afaefa903c5805f94b64f068e2b9e621'
# Generate a URL-safe token of random alphanumeric characters.
>>> secrets.token_urlsafe(16)
'gkSUKRdiPDHqmImPi2HMnw'
如果你在编写对安全敏感的应用,肯定要读一读完整文档,里面有更多建议和示例。