【问题标题】:Generate strong pseudo random digit to be used as voucher code生成强伪随机数字用作凭证代码
【发布时间】:2014-03-12 07:25:19
【问题描述】:

我需要生成一个长度为 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.urandom 生成一个长度为 N*2 的字符串。然后我在 Python 中构建了随机模块,以将字符串减少到其长度的一半。

有什么建议吗?

这样够安全吗?

【问题讨论】:

  • 您应该使用SystemRandom,而不是Random 来处理任何与安全相关的问题。

标签: python random cryptography payment


【解决方案1】:

os.urandom() 返回 bytes,因此您应该将它们重新解释为 longint;您选择先将其转换为十六进制,然后再将其进一步转换为int;这工作正常,适用于任意长数字。您可以使用struct 一步实现这一目标,但这不适用于非常大的数字,所以我认为这一步很好(除非您希望每秒执行数百万次)。

不过,您应该去掉 random.shuffle 部分。它不会为您的值添加任何“随机性”。如果您需要长度为n 的字符串,只需使用str(ri)[-n:]

【讨论】:

    【解决方案2】:

    使用这个:

    from random import SystemRandom
    def get_random_string(n):
        return int(SystemRandom().random()*10**n)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-07
      • 1970-01-01
      • 2010-09-08
      • 2014-05-18
      • 1970-01-01
      • 2012-02-12
      相关资源
      最近更新 更多