有人说Python的随机数生成器依赖于
time
这意味着如果我想创建一个这样的随机数
23987429038409238409283
并将其存储到浏览器cookie中以进行“身份验证”
有人可能会根据“时间”找到这个数字。
所以问题是,我如何创建一个随机数,让其他对代码了解很多的人猜不到。?
有人说Python的随机数生成器依赖于
time
这意味着如果我想创建一个这样的随机数
23987429038409238409283
并将其存储到浏览器cookie中以进行“身份验证”
有人可能会根据“时间”找到这个数字。
所以问题是,我如何创建一个随机数,让其他对代码了解很多的人猜不到。?
random.SystemRandom
如果它在您的系统上可用,您可以使用:
http://docs.python.org/2/library/random.html#random.SystemRandom
使用
os.urandom()
从操作系统提供的源生成随机数的函数的类。并非在所有系统上都可用。不依赖于软件状态和序列不可重现。
http://docs.python.org/2/library/os.html#os.urandom
返回适合加密使用的 n 个随机字节的字符串。
此函数从特定于操作系统的随机源返回随机字节。返回的数据对于加密应用程序来说应该是不可预测的,尽管它的确切质量取决于操作系统的实现。
例如
>>> import sys
>>> import random
>>> rng = random.SystemRandom()
>>> rng.random()
0.7195432667967437
>>> rng.randint(0, sys.maxint)
3614556690529452993
该secrets
模块是在 Python 3.6 中添加的。该模块中的所有功能都经过专门调整以用于密码学。
该
secrets
模块用于生成适用于管理密码、帐户身份验证、安全令牌和相关机密等数据的加密强随机数。特别是,
secrets
应该优先使用random
模块中的默认伪随机数生成器,该生成器是为建模和模拟而设计的,而不是安全或密码学。
该模块现在别名random.SystemRandom
为,secrets.SystemRandom
但添加了更多功能 - 例如令牌创建功能。如果您要生成要存储在 cookie 中的值,则应使用secrets.token_urlsafe
,
[返回] 一个随机的 URL 安全文本字符串,包含 nbytes 随机字节。文本是 Base64 编码的,因此平均每个字节产生大约 1.3 个字符。如果
None
提供或未提供 nbytes,则使用合理的默认值。
例子:
>>> import secrets
>>> secrets.token_urlsafe()
'Ljb7OyMt4QDXp6YObVfRi5S8h_UMykz-s8hMY_9dQP4'
请记住,未来的 Python 版本可以考虑合理的默认设置为更多字节,因此如果您将其存储到数据库列中,请不要为其设置太低的限制,或者根本不限制令牌长度.