多少位熵将

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-compatphpass
在其他语言中,我不确定。但说真的,不要再创造了。只需使用库(最好是使用bcrypt或scrypt的库)就可以了。

关于mysql - SHA2(RAND(),256)中有多少熵?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16766282/

10-13 05:20