多少位熵将
SELECT SHA2(RAND(), 256);
生成?
(实际问题:这是为密码生成随机salt的合理方法吗?)
最佳答案
让我们把这个分解。
SHA2可以引用四种算法之一:SHA224
-224位输出SHA256
-256位输出SHA384
-384位输出SHA512
-512位输出
因此,它们各自接受一个任意的输入(0到2^64-1位数据),并产生一个固定大小的输出。
注意,这里实际上没有创建熵。然而,当输入大于输出大小的熵位时,一些被破坏。当我们考虑碰撞的(小)可能性时,有时小于输出大小的输入会破坏熵。因此,我们可以说每个函数都有一个熵上界作为其输出大小。
所以散列不能增加熵。这意味着熵的上界是散列的输出大小和输入大小的较小值。
现在,您的输入是RAND()
。假设您指的是MySQL的RAND()
函数,让我们看看发生了什么。RAND()
函数产生浮点结果。现在,MySQL对FLOAT
数据类型使用4字节浮点值。这意味着,结果最多包含32位熵。
因此,组合已经降到32位熵的上限。
多亏了熵为32位的Birthday Paradox,我们在7000代中有50%的几率发生碰撞。对有效盐来说太低了。。。
这甚至没有触及到这样一个事实,即RAND()
是可预测的(在盐的情况下,这并不是世界末日)。
相反,只需要使用一个库来为您处理这一代。在PHP中,我建议password-compat或phpass。
在其他语言中,我不确定。但说真的,不要再创造了。只需使用库(最好是使用bcrypt或scrypt的库)就可以了。
关于mysql - SHA2(RAND(),256)中有多少熵?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16766282/