仅使用Java中的/ dev / random

Working ONLY with /dev/random in Java

我有一个hrng在debian喘息中提供/dev/random。它很快,所以阻塞不会是问题。现在,在我的Java代码中,我想确保我使用的是熵/DEV/NODE,而仅仅是熵。我对使用/dev/urandom之外的任何东西都没有兴趣。

我想强制Java的SurnSerdOM只从/DEV/随机获取熵。据我目前了解的实现,调用getbytes()时使用/dev/urandom,调用generateseed()时使用/dev/random。我不明白为什么。

据我所知,从/dev/urandom阅读的唯一原因是如果您喜欢速度而不是安全性。我想要尽可能高质量的熵。/dev/urandom不会。

那么,我如何强制SecureRandom只使用/dev/random(由hrng提供),并且从不接触来自劣质prng的任何东西(如/dev/uradom)?

谢谢你,一百万。


这个答案假设你知道你在做什么。在其他情况下,应尽量减少使用/dev/random。

/dev/random的作用类似于普通文件,因此任何可以读取任何文件的程序都可以从/dev/random中读取。您可能知道cat /dev/random直接从中输出随机数据,如果速度足够快,您可能实际上想要使用它。所以,如果其他一切都失败了,您将始终能够直接读取该文件…

所以,如果你看看SecureRandom的来源,你会发现它使用SecureRandomSpi进行实际工作。事实证明,NativePRNG.Blocking可以满足您的需求:

A NativePRNG-like class that uses /dev/random for both seed and random material. Note that it does not respect the egd properties, since we have no way of knowing what those qualities are. This is very similar to the outer NativePRNG class, minimizing any breakage to the serialization of the existing implementation.
Since:
1.8

问题可能是EDCOX1的6个方面,如果您不能使用Java 8,那么就有可能将它移植到早期的平台上。源代码毕竟是可用的。

现在,让我们用代码来表示:

我们必须选择要使用的具体实现。为了找到确切的名称,我们用以下行输出所有可用的服务:

1
for (Provider p: Security.getProviders()) p.getServices().forEach(System.out::println);

然后我们在里面搜索Native,我们发现下面的条目:

1
SUN: SecureRandom.NativePRNGBlocking -> sun.security.provider.NativePRNG$Blocking

这意味着我们可以像下面这样实例化SecureRandom对象来执行您想要的操作:

1
SecureRandom sr = SecureRandom.getInstance("NativePRNGBlocking","SUN");

一个简单的测试

1
2
3
byte[] b = new byte[10000];
sr.nextBytes(b);
System.out.println(Arrays.toString(b));

花了很多时间,我不得不减少读取字节的数量。如果它对你有用,恭喜你,你读的是/dev/random

请注意,尽管这个类在sun.security.provider包中,但它并不能保证在任何地方都可用。例如,它可能不适用于Android。如果这样可以,那么这个解决方案就可以工作了,否则您应该直接将其作为一个文件读取。

不要在Android上阅读/dev/random。拜托。