我需要生成一个长度为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随机模块构建,将字符串减少到其长度的一半。
有什么建议吗?
这样安全吗?
答案 0 :(得分:1)
os.urandom()
会返回 bytes ,因此您只需将其重新解释为long
或int
;您选择将其首先转换为十六进制,然后进一步将其转换为int
;这工作正常,适用于任意长数。您可以使用struct
一步完成此操作,但这不适用于非常大的数字,因此我认为该步骤很好(除非您希望每秒执行数百万次)。
但是你应该剥离random.shuffle
部分。它不会为您的值添加任何“随机性”。如果您需要一个长度为str(ri)[-n:]
的字符串,请使用n
。
答案 1 :(得分:0)
使用此:
from random import SystemRandom
def get_random_string(n):
return int(SystemRandom().random()*10**n)