SHA2中有多少熵(RAND(),256)?

时间:2013-05-27 04:26:53

标签: mysql security passwords salt sha256

熵的位数

SELECT SHA2(RAND(), 256);

产生

(实际问题:这是为密码生成随机盐的合理方法吗?)

2 个答案:

答案 0 :(得分:5)

让我们打破这一点。

SHA2可以参考4种算法之一:

  • SHA224 - 224位输出
  • SHA256 - 256位输出
  • SHA384 - 384位输出
  • SHA512 - 512位输出

因此,他们每个都采取任意输入(0到2 ^ 64-1位数据),并产生固定大小的输出。

请注意,这里实际上没有创建熵。然而,当输入超过输出大小的熵时,一些被破坏。当我们考虑到(小)碰撞的可能性时,有时小于输出大小的输入可能会破坏熵。因此,我们可以说每个函数都将熵的上限作为其输出大小。

因此散列不能增加熵。这意味着我们的熵上限是哈希输出大小的较小,以及输入的大小。

现在,您的输入为RAND()。假设你指的是MySQL的RAND()函数,那么让我们来看看发生了什么。 RAND()函数生成浮点结果。现在,MySQL对FLOAT数据类型使用4字节浮点值。这意味着最多,结果包含32位熵。

因此,该组合已经下降到32位熵的上限

感谢Birthday Paradox,在32位熵的情况下,我们在仅仅7,000代中发生碰撞的可能性为50%。这对于有效的盐来说太低了......

这甚至没有触及RAND()可预测的事实(在盐的情况下,这不是世界末日)。

相反,只需使用库来为您处理生成。在PHP中,我建议password-compatphpass

在其他语言中,我不确定。但说真的,不要重新发明它。只需使用一个库(最好使用一个使用bcrypt或scrypt的库)并完成它。

答案 1 :(得分:2)

散列函数SHA2不会对生成的盐添加任何熵,它只会将rand()的结果带入另一种形式。这意味着,所有这些都取决于rand()函数及其实现。

函数rand()当然不是随机的,如果你知道函数的状态(最后的结果),你可以预测下一个生成的值。状态本身基于种子,有时候种子由应用程序自动设置。例如,PHP从当前时间和process-id创建种子。请注意,这些值也可以预测,或者至少会缩小可能结果的范围。

我不知道rand的MYSQL实现,但我建议使用其rand()函数生成salt。实际上我永远不会让数据库生成密码的salt或哈希值,因为大多数数据库都没有提供散列密码的适当方法。相反,使用像BCrypt这样的慢键导出函数的开发环境,这些函数通常会自动创建一个安全的盐。

要回答你的问题,唯一性是盐的主要目的,因此生成盐的方法较为简单。更好的是盐也是不可预测的,因此没有人可以预先计算盐(可能的盐的范围),因此可以准备攻击。获取盐的最佳方法是使用操作系统的随机源(URANDOM)。