当前位置: 首页 > 知识库问答 >
问题:

SecureRandom是否每次都保证不同的值?

微生博简
2023-03-14

我需要生成加密安全、随机和唯一的字符串,每个字符串实际上都将用作访问令牌。为此,我计划使用Java的SecureRandom类。但是,我不确定SecureRandom是否保证唯一性。换句话说,SecureRandom在生成的每一次都会产生不同的值吗?

种子值(即new SecureRandom(byte[]种子))创建实例似乎可以工作。但是,我不确定。此外,这个答案指出种子既不安全也不可移植。种子值符合我的目的吗?

如果你有其他建议,我也想听听。

共有2个答案

蔚楷
2023-03-14

您可以利用流API支持从SecureRandom生成IntStream

SecureRandom random = new SecureRandom();
OfInt iterator = random.ints().distinct().iterator();

int random = iterator.next();

int方法返回一个“实际上是无限的伪随机int值流”,您可以对其进行区分,并在元素上获得一个迭代器。

考虑到有2^32个可能的值,我想这对于实际使用应该足够了。

充浩波
2023-03-14

否,SecureRandom实例不能保证唯一的结果。如果它确实保证了这一点,那么它就不会完全是随机的,因为你会知道你无法得到你已经收到的结果。

设置种子值并不能改善这种情况。这也不会让情况变得更糟,因为您传递的种子会添加(补充)由SecureRandom实现内部生成的种子。

如果你想要保证唯一的随机数,你需要保留之前生成的所有数字,然后在生成新数字时检查是否已经返回。如果有,您需要生成一个新号码(并重复检查)。

但是,如果生成的数字非常大,则生成非唯一数字的可能性将非常小。尝试生成256位或更多(32字节)的数字。这也是UUID用来生成“唯一”编号的机制。它们也不能保证是唯一的,但你必须等待很长很长时间(平均)才能得到一个副本。

 类似资料:
  • 问题内容: 我们的团队正在使用SecureRandom生成密钥对列表(将SecureRandom传递给KeyPairGenerator)。对于以下两种选择中的哪一种,我们无法达成共识: 每次需要生成密钥对时都创建一个新实例 初始化静态实例并将其用于所有密钥对 通常哪种方法更好, 为什么 ? 添加:我的直觉是第二种选择更安全。但我唯一的论点是基于以下假设的理论攻击:假随机性是从当前时间戳派生的:某人

  • 我有一个使用SpringLDAP 1.3.1的应用程序。它在启动时在Spring上下文中创建LdapTemplate,并将其传递给我的应用程序。我连接的LDAP字符串实际上是一个VIP设备,后面有多个Active Directory服务器。 该应用程序用于创建组层次结构,并分几个步骤进行。首先,它创建任何新组,然后删除任何删除的组,然后更新和更改组,最后更新任何新组或移动组的父级。 在最后一步中,

  • 本文向大家介绍pytorch实现保证每次运行使用的随机数都相同,包括了pytorch实现保证每次运行使用的随机数都相同的使用技巧和注意事项,需要的朋友参考一下 其实在代码的开头添加下面几句话即可: torch.manual_seed(seed) 为了生成随机数设置种子。返回一个torch.Generator对象 参数: seed (int) – 期望的种子数 torch.cuda.manual_s

  • 我在努力打字 当我保存一个实体时,有时我的数据会更新,有时不会。完全相同的请求第一次不会起作用,但第二次会起作用。我使用保存()更新和插入。插入时一切都好。 以下是我的代码(使用NestJS键入表单): == == == == 当我在save()之后找到()时,我的用户地址不会更新,而我从Mongo收到了modifiedCount 1。如果我重复这个请求,这一次它是有效的。。。 有什么想法吗?

  • 我正在执行多个ajax调用,我想在显示表单之前完成所有这些调用。如果有错误,我想停止处理,只显示遇到的第一个错误。我谷歌了很多文章,包括StackOverflow上的文章,这些文章展示了如何链接当时的语句。但是似乎我必须给每个语句都附加一个捕获,否则只捕获最后一个语句中的错误。在本例中,Lookup是一个返回promise的异步调用,ShowError处理错误: 假设至少有一个错误,是否有任何方法

  • 换句话说,以下行是否保证打印行数? 这个问题是由https://stackoverflow.com/a/41346586/2513200 我模模糊糊地记得有一次讨论,认为避免迭代的优化可能是合法的,但在快速搜索过程中没有发现任何结论。 流的JavaDocs。count包含以下语句: 这是还原的特殊情况,相当于: