为什么 random.random() 在 Python 中不安全?
Why is random.random() not secure in Python?
我在 Stack overflow 上遇到了这个问题:
How to randomly selection item from a list in Python
他们提到它不适合 cryptographic/security 目的。
所以,我在官方文档中找到了这个页面:random - Generate pseudorandom numbers
它提到他们使用 Mersenne twister 来生成随机数。
Mersenne twister 难道不应该是一个相当不错的随机生成器吗(至少我在 class 中是这么说的)?那么,为什么不能出于安全目的使用它呢?
Mersenne twister 在模仿随机性的统计属性 (*) 方面做得不错,但它是一种确定性算法。如果两个副本被设置为相同的状态,它们将同步产生相同的结果。这意味着对于 crypto/security 应用程序,如果攻击者可以确定您的初始状态,您的安全性就会受到威胁。我读过,对于 MT,这可以由知识渊博的人在六百多次连续观察后完成。
底线 - 将其用于 Monte Carlo 采样或随机模型,但不适用于加密。
(*) - 实际上,Pierre L'Ecuyer, who is considered one of the foremost researchers on pseudo-random number generation, is not a fan of MT even for Monte Carlo usage. He has shown that while the full cycle is uniformly distributed, zeros in the the internal state tend to be persistent and the generator can get "stuck" for sizeable sub-periods in non-uniform subsequences. He collaborated with the creator of Mersenne Twister to fix these issues in the WELL generator.
我在 Stack overflow 上遇到了这个问题: How to randomly selection item from a list in Python 他们提到它不适合 cryptographic/security 目的。
所以,我在官方文档中找到了这个页面:random - Generate pseudorandom numbers
它提到他们使用 Mersenne twister 来生成随机数。
Mersenne twister 难道不应该是一个相当不错的随机生成器吗(至少我在 class 中是这么说的)?那么,为什么不能出于安全目的使用它呢?
Mersenne twister 在模仿随机性的统计属性 (*) 方面做得不错,但它是一种确定性算法。如果两个副本被设置为相同的状态,它们将同步产生相同的结果。这意味着对于 crypto/security 应用程序,如果攻击者可以确定您的初始状态,您的安全性就会受到威胁。我读过,对于 MT,这可以由知识渊博的人在六百多次连续观察后完成。
底线 - 将其用于 Monte Carlo 采样或随机模型,但不适用于加密。
(*) - 实际上,Pierre L'Ecuyer, who is considered one of the foremost researchers on pseudo-random number generation, is not a fan of MT even for Monte Carlo usage. He has shown that while the full cycle is uniformly distributed, zeros in the the internal state tend to be persistent and the generator can get "stuck" for sizeable sub-periods in non-uniform subsequences. He collaborated with the creator of Mersenne Twister to fix these issues in the WELL generator.