java慢:熵相关问题

我遇到的问题是,当使用SSL时,java很慢。 解决方案是添加

  -Djava.security.egd =文件是:/ dev /./ urandom的 

到命令行的java。 由于我有多个JVM,我不想修改每个JVM来包含这个字符串,因此想将它添加到文件中

  $ JAVA_HOME / JRE / lib / security中/ java.security 

现在,java.security文件已经包含了

  securerandom.source =文件是:/ dev / urandom的 

关于这个的两个问题:

  1. 为什么以及如何“/ dev / urandom”与“/dev/./urandom”不同。 为什么java不接受“/ dev / urandom”
  2. 对于我运行的JVM,如何判断他们是否正在使用正确的urandmon设备(vs random)

这实际上是在1.3或1.4天内引入JVM的hack

http://bugs.sun.com/view_bug.do?bug_id=4705093

http://bugs.sun.com/view_bug.do?bug_id=6202721

基本问题是在本机JVM代码中,他们硬编码/dev/urandom实际使用/dev/random来尝试确保足够的熵。 由于/dev/urandom应该保证不阻塞,如果没有足够的熵可用,则会产生阻塞的意外后果。

硬编码专门针对字符串/dev/urandom ,因此提供解析为相同但不匹配的内容会导致所需的行为。 如果编码/dev/./urandom ,则绕过硬编码别名并转到预期的urandom熵源。

我不建议使用urandom进行SSL。 您的问题是您的机器没有足够的熵并且使用urandom并不能解决这个问题。 假设你在Linux上,你可以检查可用的熵:

cat /proc/sys/kernel/random/entropy_avail

如果你在拥有hw随机数生成器的机器上,你很可能想要安装rngd。 你可以通过发出命令来检查你的cpu是否有一个:

cat /proc/cpuinfo

寻找名为兰德的旗帜。 您还可以检查文件/ dev / hwrng是否存在。 您可能/想要加载相应的模块:

ls /lib/modules/*/kernel/drivers/char/hw_random

对我来说这是:

sudo modprobe tpm-rng

使它永久化:

echo tpm-rng | sudo tee -a /etc/modules

如果你碰巧在Ubuntu / Debian上,只需安装包rng-tools。

sudo aptitude install rng-tools

如果你在安装rng-tools之前和之后检查你的熵,你应该会看到显着增加。

以下命令应显示可用的熵源:

sudo rngd -f -r /dev/hwrng -v

请注意,如果您需要更好的安全性,则需要混合多个熵源。 不确定rng-tools是否支持此function。