Python 3 os.urandom

Posted

技术标签:

【中文标题】Python 3 os.urandom【英文标题】: 【发布时间】:2012-10-24 09:33:09 【问题描述】:

在哪里可以找到关于 os.urandom 的完整教程或文档?我需要得到一个随机 int 来从 80 个字符的字符串中选择一个字符。

【问题讨论】:

你为什么接受一个没有回答你问题标题的答案。更改您接受的答案或更改您的问题。如果您想了解 os.random 及其用途,那么您应该更正您接受的答案。 【参考方案1】:

如果只需要随机整数,可以使用random.randint(a, b) from the random module。

如果您需要它用于加密目的,请使用random.SystemRandom().randint(a, b),它使用os.urandom()

Example

import random

r = random.SystemRandom()
s = "some string"
print(r.choice(s)) # print random character from the string
print(s[r.randrange(len(s))]) # same

【讨论】:

random.choice 也可能是一个合理的选择。 random.choice 也可以,这取决于他最终想要对随机字符做什么。 random 是一个非加密 PRNG,我需要一个加密质量 random 您可以使用random.SystemRandom 代替random。它利用os.urandom() 并提供与random 相同的功能。 有没有办法从操作系统获取加密安全整数?【参考方案2】:

可能不完全是主题,但我想帮助那些从搜索引擎来到这里的人。要将os.urandom 转换为整数,我正在使用:

 import os

 rand = int(int(str(os.urandom(4), encoding="UTF-8")).encode('hex'), 16)
 # You can then 'cycle' it against the length.
 rand_char = chars_list[rand % 80] # or maybe '% len(chars_list)'

注意:这里的索引范围最大为4字节整数。如果您想要更多,请将4 更改为更大的值。

这个想法来自这里:https://pythonadventures.wordpress.com/2013/10/04/generate-a-192-bit-random-number/

【讨论】:

我假设 16 是内置函数 int 的一个参数,它告诉 python 给定的字符串是基数 16(十六进制)。 你为什么给 urandom 4 而不是其他数字?我知道 4 表示适合加密使用的 n 个随机字节的字符串,但是,我一直在网上看到示例,其中 4 是选择的数字,而不是说 32 或 64。你为什么不选择 64 说?更多的数字更随机/更难预测,对吧? 您能解释一下您的代码的一些细节吗?我已经在上面写了我可以通过阅读文档找到的详细信息,但想知道是否有任何警告(以及如何修复它们)或一些重要的 cmets 在尝试重用您的代码以优化随机性时给读者/或安全。谢谢。 在python3中,需要使用rand=int.from_bytes(os.urandom(4), sys.byteorder)

以上是关于Python 3 os.urandom的主要内容,如果未能解决你的问题,请参考以下文章

linux 系统 如何 安装 python (python 3.8)

python3-day3-python基础3

CentOS-6.9升级到Python-3.5

第二课 python解释器 2019/3/3

如何从Python 3.4 升级到 Python 3.5

CentOS 6 下安装Python 3