为什么Python中的random.random()不安全?

7
我在Stack Overflow上看到了这个问题:如何在Python中从列表中随机选择项,其中提到它不适用于加密/安全目的。
因此,我在官方文档中找到了这个页面:random-生成伪随机数 它提到他们使用Mersenne Twister来生成随机数。
那么,Mersenne Twister不是应该是一个相当不错的随机数生成器吗(至少我在课上是这样被告知的)?那么为什么不能将其用于安全目的呢?

1
但是随机生成器的种子不是使用操作系统库(如果存在)或系统时钟随机生成的吗?即使不是这种情况,使用他们建议的安全库又如何解决这个问题呢? - Hiten
2
random 模块的目的是为一般用途提供可用的随机数。但如果您开始使用这些随机数进行加密,那么可能会有人准备投入精力来破解您的加密,而 random 并不设计为经受住这种攻击。在这种情况下,请改用 secrets 模块。请参阅 PEP 506,了解为什么应该这样做。 - BoarGules
1
这不是我的观点,你可以获取种子(内省),一旦你拥有它,你就可以预测所有未来的数字。这在安全方面非常糟糕。 - Benoît P
好的,那很有道理!非常感谢您的评论!顺便说一下,我并不是在尝试编写自己的安全性,我只是感到困惑... - Hiten
1
@AndrewS 适用的概念是可观测性,来自系统理论 - 是否可以从一系列观察中在有限时间内推断出系统状态。对于MT来说,答案是肯定的。存在不可观测的伪随机数发生器,但它们的计算成本要比MT高得多。通常在蒙特卡洛计算中避免使用它们,因为你关心速度和统计特性,而不关心隐藏内部状态。 - undefined
显示剩余4条评论
1个回答

5
Mersenne twister可以很好地模拟随机性的统计特性(*), 但它是一个确定性算法。如果两个副本被设置为相同的状态,则它们将在同步中产生相同的结果。这意味着对于密码/安全应用程序,如果攻击者可以确定您的初始状态,则您的安全性就会受到影响。我读过关于MT的文章,了解到有经验的人在连续观察六百多次之后就可以做到这一点。

总之 - 在蒙特卡罗抽样或随机模型中使用它,但不要在密码学中使用。

(*) - 实际上,被认为是伪随机数生成方面最杰出研究人员之一的Pierre L'Ecuyer甚至不喜欢MT用于蒙特卡罗模拟。他已经表明,虽然完整的周期是均匀分布的,但内部状态中的零倾向于持久存在,并且生成器可能会在非均匀子序列中停滞相当长的时间。他与Mersenne Twister的创建者合作修复了这些问题,并创建了WELL generator


说伪随机数生成器不应用于安全目的有点误导人,因为某些加密过程,如流密码,依赖于以种子作为密钥的确定性伪随机数生成器。 - undefined
@AndrewS 这篇帖子特别是关于机器翻译的。不是故意转移话题,机器翻译明确不推荐用于加密使用。我敢打赌,如果你使用它,NSA会非常高兴。 - undefined
是的,我猜只有确定性是不够的,如果攻击者能够以某种方式找到序列的可预测性。当我整个下午都在研究伪随机数生成器,并没有考虑到由于梅森旋转算法的内部状态有时不会产生理想的随机性,所以我过于专注于“但不适用于加密”的那一点。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接