【问题标题】:Repeated set of UUIDs from java's UUID.randomUUID()来自 java 的 UUID.randomUUID() 的重复 UUID 集
【发布时间】:2016-01-27 15:29:43
【问题描述】:

我们观察到,近 200,000 个 UUID 的集合相隔两个月重播,我想知道是否有人见过类似的情况。

UUID 是使用 UUID.randomUUID() 生成的。在深入研究这个(查看 java 源代码)时,randomUUID() 在后台使用 SecureRandom(),而后者又使用 NativePRNG。据我了解,NativePRNG 使用 /dev/urandom 来获取它的种子。这当然令人费解——不知何故 /dev/urandom 相隔两个月将相同的种子返回给 NativePRNG。据我所知,一旦实例化 PRNG 就不会重新播种。这是一个长时间运行的作业,它监听消息并使用 UUID 作为它的 ID。伪代码很简单:

< receive message> String uuid = UUID.randomUUID().toString(); String fname = h.composeArtifact(uuid);

操作系统是 Centos 6,在运行 JDK1.6 的 AWS EC2 实例上。这是任何人过去见过/经历过的事情吗?似乎是那种“永远不会发生”的事情......

【问题讨论】:

  • 我不确定这是一个安全问题,而是一个 java 内部问题。
  • 在这两种情况下它们都是从新创建的实例生成的吗?
  • 如果用于保存 UUID seed 的任何内部存储是通过 Chef / Puppet / VM 快照的一部分管理的文件怎么办?我认为询问这个据称独特的种子是如何存储和操纵的,以及操作系统是否有机会将其重置为过去的值是合理的。同样有趣的是,Java 中使用的 PRNG 是否可能会遍历一小部分值,攻击者检测到的频率和方式。
  • 您说“一组 200k UUID”——其中有多少?
  • 我看到的完全一样。我只是使用testng 运行测试@Test(threadPoolSize = 50, invocationCount = 2)。当我设置invocationCount = 1 时,我的测试运行良好。但是当我将它设置为 2 或更多同时并行线程时,测试失败了。我一直在挖掘并意识到我使用UUID.randomUUID() 为我的测试对象生成的 id 在所有线程中都是完全相同的。我能够通过为每个线程添加随机延迟来规避这个问题。换句话说:如果线程完全在同一时间运行,则生成的 UUID 在所有线程中都是相同的。

标签: linux java random


【解决方案1】:

确实,从 JDK 1.6 源代码中,UUID.randomUUID()java.util.SecureRandom 实例为基础。如果你有一个重复的 UUID 序列,那么要么你很幸运(或者很不幸,取决于观点),或者有人玩过 VM 快照,或者你的 Java 配置有问题。

拍摄 VM 快照时,您会记录机器、进程和包括的 RAM 的完整实时状态。如果存在已实例化 SecureRandom 实例的实时进程,则恢复快照将带回该状态,因此每次恢复时,SecureRandom 输出的随机值序列将相同,直到 @987654327 @ reseeds 来自/dev/urandom/dev/urandom 不断收集“随机”物理事件,但这些不会影响 SecureRandom 状态,直到下一次重新播种)。

Java 配置可能会影响SecureRandom,因为SecureRandom 不是PRNG,而是由正式注册的加密提供商提供的SecureRandomSpi 实例周围的外壳。 Sun 的 JDK 带有一个默认实现,通常以系统资源为食(Linux 上为/dev/urandom)。但是,这可以配置;在java.security 文件中查找java.security.egd 系统属性以及securerandom.source 属性。默认提供程序也可以完全替换为执行不同(并且可能非常糟糕)的替代实现。有关详细信息,请参阅this answer。验证确实使用了哪些随机源可能有点复杂,但您可以尝试使用strace 启动您的进程,这将显示系统调用,从而在某个时候打开/dev/random/dev/urandom

如果您的 Java 配置良好,并且没有虚拟机快照游戏,并且您确定您确实获得了与之前相同的 UUID 序列,那么你真的真的应该买一张强力球票(但我真的不相信这种情况)。

【讨论】:

  • 我很震惊地发现,我显然完全不赞成这个答案,而且我无法扭转它,因为它太久以前了。我一定是在阅读时无所事事地点击了。并不是说它会对您的 203k 声誉得分产生负面影响,但很抱歉,这不是故意的。
猜你喜欢
  • 1970-01-01
  • 2015-11-28
  • 2011-01-31
  • 1970-01-01
  • 2018-08-15
  • 2011-04-17
  • 1970-01-01
  • 2014-02-08
  • 1970-01-01
相关资源
最近更新 更多