向JVM提供熵

时间:2018-12-17 17:49:21

标签: java random jvm bouncycastle

我一直在尝试用于Java的BouncyCastle API,并通过其“ Java密码学-工具和技术”电子书慢慢地进行工作。这本书包含一小段标题为“关于熵的词”,内容如下:

  

JVM用作熵源的方式将有所不同,例如在Linux上,通常将其设置为“ / dev / random”,这可能会阻止。通常安装   “ rng-tools”或最接近的等价物将对此进行处理,因为它也会   公开任何支持RNG生成的基础硬件,以用于   播种“ / dev / random”。在某些虚拟环境中,硬件RNG可能会   永远不可用,在这种情况下,找到使熵对JVM可用的其他方法很重要。这样做的方式会因您所使用的环境而异。

我可能会误解此摘录的意思,但是究竟如何使JVM可以使用熵呢?这本书除了说明“这样做的方式会随您所使用的环境而异”之外,并没有非常具体的说明。我是否不知道有某种熵SPI可以用来为JVM提供熵源?我的问题不是如何生成熵或从JVM检索熵,而是,如果我已经知道并可以访问可靠的熵源(例如随机比特文件),那么如何使该熵源成为可能。是否可用于JVM,以便在其他安全的熵源不可用的情况下可用于播种?

2 个答案:

答案 0 :(得分:1)

这可能因JVM供应商而异,但对于Sun / Oracle JVM,根据 Avoiding JVM Delays Caused by Random Number Generation,可以在securerandom.source文件中设置$JAVA_HOME/jre/lib/security/java.security属性。这允许改变熵的来源,例如。从/dev/random/dev/urandom

要添加更多的熵,可以简单地写入/dev/random。根据{{​​3}},这可能不安全,但是:

  

还可以写入/ dev / random。这允许任何用户将随机数据混合到池中。

答案 1 :(得分:0)

我认为您的报价至少反映了Oracle JVM。这是默认情况下通常选择的NativePRNG类的Javadoc。

public final class NativePRNG extends java.security.SecureRandomSpi
  

Solaris / Linux / MacOS的本地PRNG实现。它获得种子   通过读取系统文件(例如特殊设备)来获得随机数   文件/ dev / random和/ dev / urandom。此实现尊重   securerandom.source安全属性和java.security.egd系统   获得种子材料的特性。如果文件由   属性不存在,/ dev / random是默认的种子源。    / dev / urandom是默认的随机数来源。

     

在某些Unix平台上,/ dev / random可能会阻塞,直到有足够的熵为止。   可用,但这可能会对感知的启动时间产生负面影响。   通过选择这些来源,此实现会尝试   在性能和安全性之间取得平衡。

如您所见,/ dev / urandom而不是/ dev / random是熵的默认来源。