RAND() 是不是具有低熵来生成盐?

Posted

技术标签:

【中文标题】RAND() 是不是具有低熵来生成盐?【英文标题】:Does RAND() has low entropy to generate salts?RAND() 是否具有低熵来生成盐? 【发布时间】:2021-10-16 02:03:02 【问题描述】:

我必须加密数据库中的多个数据(无密码) 我会用盐来防止彩虹攻击。 我正在生成这样的盐:

mysalt = UNHEX(SHA2(RAND(),512))

RAND()(mysql 函数)是足够的熵源吗?我应该让我所有的盐值彼此不同,但如果我的 PRNG 有太多碰撞,情况并非如此。它是否取决于数据库中的记录数?如果是这种情况,RAND() 的限制是什么?如果上述方法不好,哪种方法可能是一种很好的替代技术?最后,加盐密码也有用吗?

【问题讨论】:

RAND() 产生 FLOAT 输出(4 字节)。您想使用 SHA-512(64 字节)。不合逻辑。 比较合适的大概是RANDOM_BYTES(len),s。 Does MySQL have a cryptographically secure random number generator?. @Akina 我在书中看到了这个生成盐的例子。您的评论很有道理,但是我已经考虑过了,但是我忽略了它,因为它有效。我不知道,但可能是数字会自动转换为字符串:dev.mysql.com/doc/refman/8.0/en/type-conversion.html 我不知道你所说的“无密码”是什么意思。您是否想生成密钥而不是盐? @TangentiallyPerpendicular 呃,不,API 相关的问题属于这里,至少正式。 Umbert,请注意,您可能需要查看 PBKDF2 或类似的密码哈希。不要只使用盐和 SHA-256 或其他非密码哈希来保护您的密码。 【参考方案1】:

我必须在我的数据库中加密几个数据(没有密码)我会使用盐来防止彩虹攻击。

如前所述,您应该使用适当的术语来确保我们谈论的是同一件事。基于 cmets,我们假设您正在为 block mode (cbc, cfb or ofb) 生成一个 IV(初始化向量)。 IV 使安全密钥重用成为可能。与彩虹表无关。

mysalt = UNHEX(SHA2(RAND(),512))

RAND() 生成一个介于 0 和 1 之间的浮点数。您的函数有效地将浮点数用作字符串,因此正确的表示法是 sha2(convert(RAND(),CHAR),128),无论如何 AES 使用的是 128 位 IV。没有理由产生更多。

RAND()(mysql 函数)是足够的熵源吗?

取决于使用的模式。某些模式(CTR、CFB)要求 IV 是唯一的(事件一个简单的计数器就足够了),对于 CBC 和 OFB 模式,IV 需要是“不可预测的”(比随机更强大的术语)。

我无法找到 RAND() 函数的源状态,然后我无法保证它不会被暴力破解(可以在 NLFSR PRNG 的基于时间戳的源的情况下完成)。我不太愿意深入研究 mysql 源代码(我记得 mysql 使用 OS rand 函数,所以它取决于底层系统,我可能在这里错了)。因此,在初始状态足够随机的假设下,RAND() 可以安全地为 CBC 生成 IV。似乎这里没有人能够证实或否认这一假设。使用RANDOM_BYTES() 保证使用加密安全的随机源。

它是否取决于数据库中的记录数? 如果是这种情况,RAND() 的限制是什么?

您需要 key-iv 的唯一组合。记录越多,发生值冲突的概率就越高。在这里,我们再次使用取决于系统的初始 RAND 状态大小,尽管在评论中有人声称它是 4 个字节。这真的不算多。

如果上述方法不好,那可能是一种好的替代技术? 最后,加盐密码也有用吗?

如前所述,RANDOM_BYTES 正在使用 SSL 库中的随机生成器,这需要在加密上可行。

【讨论】:

以上是关于RAND() 是不是具有低熵来生成盐?的主要内容,如果未能解决你的问题,请参考以下文章

rand 函数是不是在 MATLAB/Octave 中产生 0 或 1 的值?

函数RAND啥意思

rand产生随机数怎样控制在1~52内而且不能重复。1~52必须出现一次。谢谢

已知可生成0~4的rand5(),实现生成0~6的rand7()

rand产生随机数怎样控制在1~52内而且不能重复。1~52必须出现一次。谢谢

sqlserver 中rand()是产生随机数,为啥还要设置种子?