secrets模块是在python3.6中加入的全新模块,它提供当前操作系统所提供的最安全的随机访问。
在控制访问,身份认证中比较实用。
secrets.choice(sequence)
随机返回序列中的某个序列,如果序列为空会抛IndexError
>>> secrets.choice([1,2,3,4])
1
跟**random.choice()**类似
secrets.randbelow(n)
返回一个小于n的[0,n)的随机整数
secrets.randbits(k)
返回一个k个比特的整数
secrets.randbelow(2**k)
可以完成同样的功能
tokens
secrets.token_bytes([nbytes=None])
返回n位的随机字节字符串,默认是32位
>>> secrets.token_bytes(8)
b'\xba\xd7)}ok\xbe\\'
secrets.token_hex([nbytes=None])
返回一个n位的16进制字符串,默认32位
>>> secrets.token_hex(16)
'd7793b76242678c92bdebd829d94a889'
secrets.token_urlsafe([nbytes=None])
返回一个n位安全的url字符串,默认32位
>>> secrets.token_urlsafe(16)
'LIcGiVXBXwgG0j5ixEZR6A'
其他函数
secrets.compare_digest(a, b)
返回bool值,即比较a和b的值,如果相同则返回真,否则假。
为什么不直接比较ab的值,这么做是出于安全考虑的,有利于防止时序攻击。
普通的比较处于效率考虑在ab不同的时候会返回假。这么做对于攻击者来说,可以通过检测函数的执行事件来推测到哪一位出错了,使得攻击的复杂度下降。
安全的做法是在ab某位不同的时候记录下来,然后继续比较,直到全部的位都比较完成再返回结果。