mysql - RAND() 是否具有低熵来生成盐?
问题描述
我必须加密我的数据库中的几个数据(没有密码)我会使用盐来防止彩虹攻击。我正在生成这样的盐:
mysalt = UNHEX(SHA2(RAND(),512))
RAND() (mysql 函数) 是足够的熵源吗?我应该让我所有的盐值彼此不同,但如果我的 PRNG 有太多碰撞,情况并非如此。它是否取决于数据库中的记录数?如果是这种情况,限制是什么RAND()
?如果上述方法不好,哪种方法可能是一种很好的替代技术?最后,加盐密码也很好吗?
解决方案
我必须加密我的数据库中的几个数据(没有密码)我会使用盐来防止彩虹攻击。
如前所述,您应该使用适当的术语来确保我们谈论的是同一件事。根据评论,假设您正在为块模式 (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 库中的随机生成器,这需要在加密上是可行的。
推荐阅读
- android - 取消 Android 中所有以前的 Api 调用 - 改造 - 使用模块
- amazon-web-services - DynamoDB 一对一
- optimization - 如何在最小化目标参数的同时重新评估 Gekko 目标
- flutter - 等到firestore中的数据成功更新
- vue.js - vue中如何根据获取的数据增加图标的数量
- oracle - 有没有办法在oracle sql developer中对列的每个字段执行md5散列,并将结果散列存储在相应的列中(md5)
- flutter - 同时在单个小部件上使用多个模拟
- sql - SQL 查询运行总数
- nginx - Nginx 使用 proxy_pass 重写重定向
- php - WooCommerce:如果用户已登录并且产品正在销售,则显示内容