我们注意到一组将近200,000个UUID,相隔两个月重复出现,我想知道是否有人看到过类似的情况。
UUID是使用UUID.randomUUID()生成的。在深入研究此问题时(查看Java源代码),randomUUID()在底层使用SecureRandom(),而SecureRandom()又使用NativePRNG。据我了解,NativePRNG使用/dev/urandom获取其种子。当然,这意味着令人困惑-即/dev/urandom在两个月后以某种方式向NativePRNG返回了相同的种子。据我所知,一旦实例化PRNG,它就不会重新播种。这是一个长时间运行的作业,它正在侦听消息并使用UUID作为其ID。伪代码如下: <接收消息> String uuid = UUID.randomUUID().toString(); String fname = h.composeArtifact(uuid);
操作系统是Centos 6,在运行JDK1.6的AWS EC2实例上运行。是否有人在过去看到/经历过这种情况?看起来像是“永远不会发生”的事情...
UUID是使用UUID.randomUUID()生成的。在深入研究此问题时(查看Java源代码),randomUUID()在底层使用SecureRandom(),而SecureRandom()又使用NativePRNG。据我了解,NativePRNG使用/dev/urandom获取其种子。当然,这意味着令人困惑-即/dev/urandom在两个月后以某种方式向NativePRNG返回了相同的种子。据我所知,一旦实例化PRNG,它就不会重新播种。这是一个长时间运行的作业,它正在侦听消息并使用UUID作为其ID。伪代码如下: <接收消息> String uuid = UUID.randomUUID().toString(); String fname = h.composeArtifact(uuid);
操作系统是Centos 6,在运行JDK1.6的AWS EC2实例上运行。是否有人在过去看到/经历过这种情况?看起来像是“永远不会发生”的事情...
UUID种子
的任何内部存储是通过Chef/Puppet/虚拟机快照之一来进行管理的文件,那该怎么办呢?我认为询问如何存储和操作这个所谓唯一种子以及操作系统管理方式是否可能导致其被重置到过去值是合理的。同样有趣的是Java中使用的PRNG是否有可能循环使用小子集的值,以及攻击者如何检测到这种情况以及多久发生一次。 - Steve Dodier-Lazarotestng
运行了一个测试@Test(threadPoolSize = 50, invocationCount = 2)
。当我将invocationCount = 1
时,我的测试正常运行。但是当我将其设置为2或更多以进行并行线程测试时,测试失败了。我一直在研究并意识到我使用UUID.randomUUID()
生成的测试对象ID在所有线程中都是完全相同的。我通过为每个线程添加随机延迟来解决了这个问题。换句话说:如果线程恰好同时运行,则在所有线程中生成的UUID相同。 - Oliver Hausler