我需要生成一个长度为N的强伪随机数(仅包含字符0-9的字符串)。
为了在支付系统中用作凭证代码,需要很难预测生成的字符串。
请检查我的代码。这是我想出的:
import os
import binascii.hexlify
import random
def get_string_random_digit(n):
r = os.urandom(n*2)
ri = int(binascii.hexlify(r), 16)
arr = list(str(ri))
while len(arr) > n:
random.shuffle(arr)
arr.pop()
return str(''.join(arr))
os.urandom应该可以安全地用于密码学中,因此我认为可以安全地用于凭证支付系统中。
如果相关的话,该系统将在Ubuntu 12.04 LTS上运行(urandom显然取决于OS的实现)。
我首先使用os.urandom生成长度为N * 2的字符串。然后,我们构建了Python随机模块,以将字符串减少到其长度的一半。
有什么建议?
这样够安全吗?
os.urandom()
返回字节,因此您应该将它们重新解释为along
或int
; 您选择先将其转换为十六进制,然后再将其转换为int
;这可以正常工作,并且可以用于任意长数。您可能曾经struct
一步就可以做到这一点,但是这对于很大的数字来说是行不通的,因此我认为这一步就很好了(除非您想每秒进行数百万次此操作)。
不过,您应该删除该random.shuffle
部分。它不会为您的值增加任何“随机性”。str(ri)[-n:]
如果您需要一长串,请使用n
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句