从CPython 3.3,默认情况下启用哈希随机化。在以前的版本中,可以通过指定来打开它-R命令行选项或通过设置PYTHONHASHSEED环境变量 to random
.
引用了文档:
默认情况下,__hash__()
str、bytes 和 datetime 的值
对象被“加盐”,具有不可预测的随机值。虽然他们
在单个 Python 进程中保持不变,但它们不是
Python 的重复调用之间是可预测的。
这是否意味着生成的值在加密方面将是强大的?
在 Python 3.3 中,哈希种子的加密强度不高;它是在启动时使用以下伪随机生成器生成的:
/* Fill buffer with pseudo-random bytes generated by a linear congruent
generator (LCG):
x(n+1) = (x(n) * 214013 + 2531011) % 2^32
Use bits 23..16 of x(n) to generate a byte. */
static void
lcg_urandom(unsigned int x0, unsigned char *buffer, size_t size)
{
size_t index;
unsigned int x;
x = x0;
for (index=0; index < size; index++) {
x *= 214013;
x += 2531011;
/* modulo 2 ^ (8 * sizeof(int)) */
buffer[index] = (x >> 16) & 0xff;
}
}
这不是加密性强.
还有哈希种子的其他问题这仍然使得强制碰撞成为可能。
Python 3.4解决了这些问题通过引入一个更安全的哈希算法默认情况下,并使其可插拔。
如果您的程序中需要加密的强随机数,请使用random.SystemRandom() or os.urandom()反而。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)