python - 如果种子既可以是时间也可以是来自 /dev/urandom 的熵,为什么 random.randbytes() 不安全?
问题描述
/dev/urandom 用于更推荐的 secrets.py 库中。也有人说随机模块使用当前时间或 /dev/urandom 中的系统熵。然后:
它默认使用什么种子?当我自己没有定义种子时,是来自 /dev/urandom 的时间还是熵?
如果它默认使用 /dev/urandom,那么它应该和 secrets 模块一样安全。
Ps 我看过一个类似的问题。由于前一个问题仍未得到解答,我的好奇心仍未得到充分满足。
这个问题是在我查看https://github.com/tna0y/Python-random-module-cracker之后才出现的
解决方案
您链接到的饼干表明它可以根据先前的值预测未来的值。所以想象一下这种(极端)情况:对于某些加密,您构建一个具有 624*32 随机位的公钥,然后构建一个具有 624*32 随机位的私钥。然后我们可以根据您的公钥计算出您的私钥。不好。
演示结果:
47 out of 100 private keys cracked
演示代码:
import random, os
from randcrack import RandCrack
def create_keys():
random.seed(os.urandom(10000))
public_key = [random.getrandbits(32) for _ in range(624)]
private_key = [random.getrandbits(32) for _ in range(624)]
return public_key, private_key
def crack(public_key):
rc = RandCrack()
for x in public_key:
rc.submit(x)
cracked_private_key = [rc.predict_getrandbits(32) for _ in range(624)]
return cracked_private_key
def demo():
cracked = 0
for attempt in range(1, 101):
public_key, private_key = create_keys()
cracked += crack(public_key) == private_key
print(cracked, 'out of', attempt, 'private keys cracked')
demo()
推荐阅读
- javascript - popover 在 $.each(data, function (key, value) 中不起作用
- alexa - 当用户在 echo show 上什么都不说时,Alexa 没有返回 SessionEndedRequest
- react-native - 错误:捆绑失败:分辨率不明确。无法通过清除缓存解决
- c - C中的最大小数位数
- react-native - 在 React Native 中访问嵌套数组的值
- c# - C#中的MYSQL如何添加到我的使用中
- shell - 为什么我不能将 tail -f 管道传输到我的 shell 脚本中?
- javascript - 无法将角度控制器的数据提取到 HTML 中
- google-bigquery - 使用 BigQuery 时如何阻止恶意查询夸大您的帐单
- docker - IdentityServer4 + Docker:远程证书根据验证程序无效