Random 生成*非重复*安全随机数的最佳方法是什么?

Random 生成*非重复*安全随机数的最佳方法是什么?,random,uuid,birthday-paradox,Random,Uuid,Birthday Paradox,我正在研究需要安全地分配随机、短~40位ID的东西。它们必须是唯一的,这意味着在中央服务器上执行 每次只使用一个新的SecureRand会遇到生日问题,并开始花费更长的时间来生成新条目 有什么更好的方法吗?你是对的,如果只是随机选择40位,即使你只需要几位,40位也太短,无法避免冲突。事实上,无论使用哪种算法,都不能称它们为安全的。然而,假设你需要的数据远少于整个万亿,并且你并不需要更大空间的安全性,那么你真的只有一个选择:拒绝采样。即随机生成并与现有的进行比较。正如你所说,这不会开始花费更长的

我正在研究需要安全地分配随机、短~40位ID的东西。它们必须是唯一的,这意味着在中央服务器上执行

每次只使用一个新的SecureRand会遇到生日问题,并开始花费更长的时间来生成新条目


有什么更好的方法吗?

你是对的,如果只是随机选择40位,即使你只需要几位,40位也太短,无法避免冲突。事实上,无论使用哪种算法,都不能称它们为安全的。然而,假设你需要的数据远少于整个万亿,并且你并不需要更大空间的安全性,那么你真的只有一个选择:拒绝采样。即随机生成并与现有的进行比较。正如你所说,这不会开始花费更长的时间,直到你真的接近那万亿,因为你可以找到用过的O1散列。使用像40位循环生成器这样不会重复并只跟踪最后一个循环生成器的东西是不安全的,而且会使并行化变得困难。

考虑到我是如何使用它们的,它们不需要在强加密意义上是安全的。参见第2页第4b部分Ryan的评论。生成,查看是否存在,如果默认值为“是”,则重复该操作;如果默认值为“否”,则输出,但它将运行到50%的级别@~2^20项,这远远低于预期的分配。如果您需要接近2^20个键,则使用40位键空间是不明智的。你真的需要在这里质疑你的假设。备份并重新审视你真正需要的东西。你看过谷歌文档了吗?这不是密码分析攻击的标准问题。实用的密钥空间受到人类可用性的严重限制,并且它不受大多数攻击的影响,因为这些攻击必须使用非常稀疏的空间。我刚刚阅读了文档是的,选择了40位来表示一个可以合理增长到2^30个分配的空间。这可能足够的净空,即使在国际范围内扩展,也不会很快耗尽,但是的,随机的净空会相互碰撞。就像我说的,你可能一直在生成它们并检查数据库。只需确保数据库是为了快速比较而组织的。因此,问题是:有没有更好的方法来生成它们,例如Ryan的建议,它在整个键空间的随机排列中迭代而不重复?