hash()随机化是否被认为是加密强大的?

vau*_*tah 2 python hash python-3.x python-3.3 random-seed

CPython 3.3开始,默认情况下启用哈希随机化.在以前的版本中,它可以通过指定被打开-R命令行选项,或通过设置PYTHONHASHSEED环境变量random.

引用文档:

默认情况下,__hash__()str,bytes和datetime对象的值使用不可预测的随机值"加盐".虽然它们在单个Python进程中保持不变,但是在重复调用Python之间它们是不可预测的.

这是否意味着生成的值将加密强大?

Mar*_*ers 6

在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;
    }
}
Run Code Online (Sandbox Code Playgroud)

这不是加密强大的.

散列播种还存在其他问题,仍然可以强制发生冲突.

Python 3.4 通过默认引入更安全的哈希算法解决这些问题,并使其可插入.

如果您在程序中使用random.SystemRandom()或需要加密强大的随机数os.urandom().