生成强伪随机数字以用作凭证代码

时间:2014-02-13 12:10:16

标签: python random cryptography payment

我需要生成一个长度为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随机模块构建,将字符串减少到其长度的一半。

有什么建议吗?

这样安全吗?

2 个答案:

答案 0 :(得分:1)

os.urandom()会返回 bytes ,因此您只需将其重新解释为longint;您选择将其首先转换为十六进制,然后进一步将其转换为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)