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的主要内容,如果未能解决你的问题,请参考以下文章