【问题标题】:Does javax.crypto.KeyGenerator uses /random or /urandom to generate keys?javax.crypto.KeyGenerator 是否使用 /random 或 /urandom 来生成密钥?
【发布时间】:2018-01-06 16:33:38
【问题描述】:

考虑以下 sn-p,我使用 AES-256 生成要加密的密钥 - 运行以下 sn-p 的线程被阻塞。我怀疑这是否可能是由于没有达到足够的熵的问题。因此,线程可以挂起(或)看起来挂起,直到系统收集到足够的熵。

我在虚拟机上而不是在物理机上运行它,而且我使用的是 Java8。

片段 A

KeyGenerator keyGen = KeyGenerator.getInstance("AES");
keyGen.init(256);
SecretKey key = keyGen.generateKey();

以下article推断SecureRandom实例获取时为

SecureRandom secureRandom = new SecureRandom();

默认用于生成熵的NativePRNG算法称为SHA1PRNG,默认使用/dev/urandom,因此不会发生线程阻塞。

我会谈到为什么要谈论这些东西。线

keyGen.init(256);

上面的sn-p在内部做了如下动作。

 public final void init(int paramInt) {
     init(paramInt, JceSecurity.RANDOM);
 }

这个JceSecurity.RANDOM拥有的是这个

static final SecureRandom RANDOM = new SecureRandom();

意味着它应该使用/dev/urandom,并且在未收集熵时不应该阻塞(或)挂起。

我在这里分享我的java.security 文件。

有人能解释一下为什么上面的线程运行SNIPPET A 块吗?

【问题讨论】:

  • 第一个问题是:你能提供 MCVE 来重现这个阻塞问题吗?
  • 不要装傻。。你是在问一个完整的sn-p,我可以从哪里重现这个问题@Andremoniy
  • 我在询问 MCVE,如果它很大,可能会在 GitHub 上的某个地方共享,或者只是包含 main 方法和所有需要的逻辑的完整类。因为这听起来像是一个 JVM 错误,或者它可能只是代码中不可重现的错误配置或误用(例如,如果您在多个线程之间的共享内存中使用 keyGenerator)。
  • @Andremoniy : 这是完整的类文件docs.zoho.com/file/4xwcwd7e074921bb14c829d6d41dc58515106
  • 这绝对不是 MCVE。

标签: java random cryptography virtual-machine entropy


【解决方案1】:

最终,随机数生成器将始终依赖于操作系统的熵源,如果只是为了播种;毕竟从非随机环境中生成随机数是不可能的。

我可以想象,熵源数量有限的虚拟机很难填满入口池,即使只有一次。解决此问题的最佳方法是确保您的 VM 安装了最新的客户端添加。这些可以/应该使主机 RNG 可用于客户端计算机。

可以创建一个SecureRandom 实例并将其作为参数传递给各种init() 方法。但是,这并不能解决一开始就阻止它的问题,而且它不必要地使代码复杂化。最后,您永远不会知道哪个库或模块仍在实例化另一个 SecureRandom 实例。

所以我会专注于修复客户端 VM 的 RNG,而不是 Java 代码。


注意NativePRNG直接使用OS RNG;它不使用"SHA1PRNG"SecureRandom() 使用第一个包含类实现的提供者;如果使用默认 PRNG,请确保您没有包含 PRNG 速度较慢的提供程序。

【讨论】:

  • “如果使用默认 PRNG,请确保您没有包含 PRNG 速度较慢的提供程序” - 我不清楚这一点。我的安全文件中有以下配置,securerandom.source=file:/dev/random 因此,“NativePRNG”实现将是首选 - 因此,它使用 /dev/random 而不/dev/urandom 对吗?
  • 是的,如果没有收集到足够的熵,那将是阻塞的。一般来说,使用/dev/random 并没有比/dev/urandom 有很多(如果any)优势。仅当您生成长期(非对称)密钥时才使用它——即便如此,我也会非常谨慎地使用它,或者选择更可靠的/dev/urandom。那边好像有人有点太注重安全了:)
  • 什么是客户端添加?
  • 根据所使用的 VM 解决方案,VM 客户端扩展允许剪贴板复制和粘贴等操作,但也允许使用例如图形加速。它们需要在安装客户端操作系统后安装。他们可能会安装特定的驱动程序,有时包括连接到主机操作系统的安全 RNG 的驱动程序。我使用了一个通用术语,因为名称取决于所使用的 VM 应用程序。
猜你喜欢
  • 2013-02-02
  • 2011-02-04
  • 2012-08-07
  • 1970-01-01
  • 1970-01-01
  • 2021-12-05
  • 1970-01-01
  • 1970-01-01
  • 2016-12-24
相关资源
最近更新 更多