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

Mysql SHA2中有多少熵(RAND(),256)?,mysql,security,passwords,salt,sha256,Mysql,Security,Passwords,Salt,Sha256,熵有多少位 SELECT SHA2(RAND(), 256); 生成 (实际问题:这是为密码生成随机salt的合理方法吗?哈希函数SHA2不会向生成的salt添加任何entrophy,它只是将rand()的结果转换为另一种形式。这意味着,这一切都取决于rand()函数及其实现 函数rand()当然不是随机的,如果知道函数的状态(最后的结果),就可以预测下一个生成的值。状态本身基于种子,有时此种子由应用程序自动设置。例如,PHP根据当前时间和进程id创建一个种子。请注意,这些值也是可以预测的,或

熵有多少位

SELECT SHA2(RAND(), 256);
生成


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

哈希函数SHA2不会向生成的salt添加任何entrophy,它只是将
rand()
的结果转换为另一种形式。这意味着,这一切都取决于
rand()
函数及其实现

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

我不知道rand的MYSQL实现,但我不建议使用它的
rand()
函数来生成salt。实际上,我永远不会让数据库生成密码的salt或hash值,因为大多数数据库都没有提供适当的方式来散列密码。相反,使用具有慢键派生函数的开发环境,例如,此类函数通常会自动创建安全的salt


为了回答你的问题,独特性是盐的主要用途,所以有更弱的方法来生产盐。最好是一种不可预测的盐,这样就没有人可以预先计算盐(可能的盐的范围),从而可以准备攻击。获取salt的最佳方法是使用操作系统的随机源(URADOM)。

哈希函数SHA2不会向生成的salt添加任何entrophy,它只是将
rand()
的结果转换为另一种形式。这意味着,这一切都取决于
rand()
函数及其实现

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

我不知道rand的MYSQL实现,但我不建议使用它的
rand()
函数来生成salt。实际上,我永远不会让数据库生成密码的salt或hash值,因为大多数数据库都没有提供适当的方式来散列密码。相反,使用具有慢键派生函数的开发环境,例如,此类函数通常会自动创建安全的salt

为了回答你的问题,独特性是盐的主要用途,所以有更弱的方法来生产盐。最好是一种不可预测的盐,这样就没有人可以预先计算盐(可能的盐的范围),从而可以准备攻击。获取salt的最佳方法是,使用操作系统的随机源(URANDOM)。

我们来分析一下

SHA2可参考4种算法之一:

  • SHA224
    -224位输出
  • SHA256
    -256位输出
  • SHA384
    -384位输出
  • SHA512
    -512位输出
因此,它们各自接受任意输入(0到2^64-1位数据),并产生固定大小的输出

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

所以散列不能增加熵。这意味着熵的上限是散列的输出大小和输入大小中的较小者

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

因此,组合已降至32位熵的上限

多亏了32位的熵,我们在7000代人的时间里就有50%的几率发生碰撞。这对一种有效的盐来说太低了

这甚至没有触及到这样一个事实:
RAND()
是可预测的(就盐而言,这不是世界末日)

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

在其他语言中,我不确定。但说真的,别再重复了。只需使用一个库(最好是使用bcrypt或scrypt的库)就可以了

我们来分析一下

SHA2可参考4种算法之一:

  • SHA224
    -224位输出
  • SHA256
    -256位输出
  • SHA384
    -384位输出
  • SHA512
    -512位输出
因此,它们各自接受任意输入(0到2^64-1位数据),并产生固定大小的输出

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

所以散列不能增加熵。这意味着熵的上界是th的输出大小中的较小者