我一直在尝试用于Java的BouncyCastle API,并通过其“ Java密码学-工具和技术”电子书慢慢地进行工作。这本书包含一小段标题为“关于熵的词”,内容如下:
JVM用作熵源的方式将有所不同,例如在Linux上,通常将其设置为“ / dev / random”,这可能会阻止。通常安装 “ rng-tools”或最接近的等价物将对此进行处理,因为它也会 公开任何支持RNG生成的基础硬件,以用于 播种“ / dev / random”。在某些虚拟环境中,硬件RNG可能会 永远不可用,在这种情况下,找到使熵对JVM可用的其他方法很重要。这样做的方式会因您所使用的环境而异。
我可能会误解此摘录的意思,但是究竟如何使JVM可以使用熵呢?这本书除了说明“这样做的方式会随您所使用的环境而异”之外,并没有非常具体的说明。我是否不知道有某种熵SPI可以用来为JVM提供熵源?我的问题不是如何生成熵或从JVM检索熵,而是,如果我已经知道并可以访问可靠的熵源(例如随机比特文件),那么如何使该熵源成为可能。是否可用于JVM,以便在其他安全的熵源不可用的情况下可用于播种?
答案 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是熵的默认来源。