我怎样才能创build一个随机数在python密码保护?
我正在做一个Python项目,我想创build一个密码安全的随机数字,我该怎么做? 我已经在网上读到,规则随机数生成的数字不是encryption安全的,并且函数os.urandom(n)
返回给我一个string,而不是一个数字。
你可以通过在os.urandom
返回的字节上应用ord
函数来得到一个随机数列表,就像这样
>>> import os >>> os.urandom(10) 'm\xd4\x94\x00x7\xbe\x04\xa2R' >>> type(os.urandom(10)) <type 'str'> >>> map(ord, os.urandom(10)) [65, 120, 218, 135, 66, 134, 141, 140, 178, 25]
引用os.urandom
文档,
返回适合密码使用的
n
随机字节的string。该函数从特定操作系统的随机源中返回随机字节。 返回的数据对于encryption应用程序来说应该是不可预测的,尽pipe它的确切质量取决于操作系统的实现。 在类UNIX系统上,它将查询
/dev/urandom
,并在Windows上使用CryptGenRandom()
。
既然你想在一些特定的范围内生成整数,那么使用random.SystemRandom
类就会容易random.SystemRandom
。 创build该类的实例将为您提供一个对象,该对象支持random
模块的所有方法,但在封面下使用os.urandom()
。 例子:
>>> from random import SystemRandom >>> cryptogen = SystemRandom() >>> [cryptogen.randrange(3) for i in range(20)] # random ints in range(3) [2, 2, 2, 2, 1, 2, 1, 2, 1, 0, 0, 1, 1, 0, 0, 2, 0, 0, 0, 0] >>> [cryptogen.random() for i in range(3)] # random floats in [0., 1.) [0.2710009745425236, 0.016722063038868695, 0.8207742461236148]
等直接使用urandom()
,你必须发明自己的algorithm,将其产生的随机字节转换成你想要的结果。 不要这样做;-) SystemRandom
为你做。
请注意这部分文档:
class random.SystemRandom([seed])
使用os.urandom()函数从操作系统提供的源生成随机数的类。 不适用于所有系统。 不依赖于软件状态,序列不可重现。 因此,seed()和jumpahead()方法没有效果,并被忽略。 如果调用getstate()和setstate()方法会引发NotImplementedError。
Python 3.6引入了一个新的秘密模块 ,它提供了访问操作系统提供的最安全的随机性来源。 为了生成一些密码安全的号码,你可以调用secrets.randbelow()
。
secrets.randbelow(n)
这将返回一个介于0和n
之间的数字。
如果你想要一个n
位的随机数,在Python 2.4+下,我find的最简单的方法是
import random random.SystemRandom().getrandbits(n)
请注意, os.urandom()
使用os.urandom()
,因此此方法的结果与系统的urandom()
实现一样好。
要生成密码安全的伪随机整数,可以使用以下代码:
int(binascii.hexlify(os.urandom(n)),16)
其中n
是一个整数, n
越大,生成的整数越大。
你将不得不先导入os
和binascii
。
此代码的结果可能因平台而异。