【发布时间】: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