Moo*_*als 1 mysql security passwords salt sha256
熵的位数是多少
SELECT SHA2(RAND(), 256);
Run Code Online (Sandbox Code Playgroud)
生成?
(实际问题:这是为密码生成随机盐的合理方法吗?)
让我们打破这个.
SHA2可以参考4种算法之一:
SHA224 - 224位输出SHA256 - 256位输出SHA384 - 384位输出SHA512 - 512位输出因此,它们各自采用任意输入(0到2 ^ 64-1位数据),并产生固定大小的输出.
请注意,这里实际上没有创建熵.然而,当输入超过输出大小的熵时,一些被破坏.当我们考虑到(小)碰撞的可能性时,有时小于输出大小的输入可能会破坏熵.因此,我们可以说每个函数都将熵的上界作为其输出大小.
因此散列不能增加熵.因此,这意味着我们的熵上限是较小的散列输出大小和输入的大小的.
现在,你的输入是RAND().假设您指的是MySQL的RAND()功能,那么让我们来看看发生了什么.该RAND()函数产生浮点结果.现在,MySQL对FLOAT数据类型使用4字节浮点值.这意味着最多,结果包含32位熵.
因此,该组合已经下降到32位熵的上限.
由于生日悖论,在32位熵下,我们在仅仅7,000代中发生碰撞的可能性为50%.这对于有效的盐来说太低了......
而这甚至没有触及RAND()可预测的事实(在盐的情况下,这不是世界末日).
相反,只需使用库来为您处理生成.在PHP中,我建议使用password-compat或phpass.
在其他语言中,我不确定.但说真的,不要重新发明它.只需使用一个库(最好使用一个使用bcrypt或scrypt的库)并完成它.