首页 > 解决方案 > RAND() 是否具有低熵来生成盐?

问题描述

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

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

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

标签: mysqlsqlsecurityencryptioncryptography

解决方案


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

如前所述,您应该使用适当的术语来确保我们谈论的是同一件事。根据评论,假设您正在为块模式 (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 库中的随机生成器,这需要在加密上是可行的。


推荐阅读