我怎样才能创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越大,生成的整数越大。

你将不得不先导入osbinascii

此代码的结果可能因平台而异。