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