用Python创建一个“uncrackable”“随机”数字

时间:2013-08-04 20:36:23

标签: python

据说Python的随机数生成器依赖于

time

这意味着如果我想创建一个像这样的随机数

23987429038409238409283

并将其存储到浏览器Cookie中以进行“身份验证”

有些人可以根据“时间”找到这个号码。

所以问题是,我如何创建一个随机数字,这些随机数字无法被知道很多代码的其他人猜到。 ?

2 个答案:

答案 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版本可以将合理的默认视为更多的字节,因此如果您将其存储到数据库列中,请不要设置太低的限制,或者根本不限制令牌长度。