如何在JRE(Java运行时环境)中收集熵源?

时间:2017-05-03 02:19:51

标签: java random seed

我希望在JRE中找到熵源(噪声源)。 (熵源是指PRNG(伪随机数发生器)的种子材料(或种子)。)

但是,我并不确切知道种子的熵来源是什么。

所以我很难在JRE中找到合适的熵源。

你能告诉我这个吗?

3 个答案:

答案 0 :(得分:1)

您可以从JVM中的不同来源提取熵:

  • 最明显的来源是时钟

    System.currentTimeMillis();
    System.nanoTime();
    
  • 您可以请求可用内存,该内存经常更改

    Runtime.getRuntime().freeMemory()
    
  • 您还可以将对象的内部hashCode用作熵

    System.identityHashCode(someObject)
    new Object[0].hashCode()
    
  • 想要更重的东西,也许最全面的熵源是map,它们具有许多特性,这些特性会随时间变化而无法预测。

    ManagementFactory.getMemoryMXBean()
    ManagementFactory.getThreadMXBean()
    ...
    
  • 最后,例如,您始终可以生成MXBeansRandom数字或SecureRandom

    new Random().nextLong()        
    new SecureRandom().nextLong()
    UUID.randomUUid()
    

顺便说一句,有人问了同样的问题random UUIDs,但没有更多的成功。

答案 1 :(得分:0)

想象一下JVM是一个沙盒。

当您不被允许离开沙箱时,您的选择非常有限。然后你可以做一些简单的事情,例如要求用户在键盘上进行随机输入,或者你建立一个面板并让他用鼠标画一些东西。

但是,如果您的用例允许进行系统调用,您可以根据您运行的操作系统的细节查看更高级的选项。

答案 2 :(得分:0)

如果您对底层操作系统或其他JVM源外部不感兴趣,您可能应该使用SecureRandom。

以下是Oracle的官方回答:

  

快速随机数,专为真正随机性的基本任务而设计   不是主要目标。这对于像色彩的颜色很有用   使用,防止力导向布局重叠,或哪些图片   在评估人口统计信息后从列表中显示。

     

高并发程序如果有价值,也可以使用ThreadLocalRandom   速度超过真正的随机性。这与上面相同但很可能   如果同时线程生成伪随机,则提供更好的性能   数字在同一时间。

     

较慢但更随机的SecureRandom   专为无法预测数字的重要任务而设计的   成功至关重要。例子包括赌博,科学等案例   抽样或任何加密操作。虽然慢了   其他两个随机数生成器,其在许多中具有更好的随机性   应用

完整帖子:https://blogs.oracle.com/java-platform-group/thats-so-securerandom