我有一个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)?
谢谢你,一百万。
- 我在下面添加了一个代码示例,请测试它,看看它是否有效。
- 也许把"天王星"化作"随机"?
- @hotlicks:这样整个过程就不能再从/dev/urandom中读取了,即使它想要?
- @StackOverflowException——这只是一个建议,目的可能是触发对问题的不同方法,而不是解决方案本身。
- @霍特里克斯:当然,我的评论并不是为了阻止这个解决方案。最简单的解决方案可能是最好的,所以如果它有效的话,这是一个很好的解决方案。在简单的混叠中隐藏的问题是我们不知道是否应该使用/dev/urandom,也许需要一个组合…
- @StackOverflowException-对于不控制代码的情况,调用mknod /dev/urandom 1 8肯定足以确保始终使用hprng。当你控制代码的时候,你可以选择哪一个最简单!
- 值得指出的是,如果你的hrng足够快以至于它永远不会阻塞,那么如果你从/dev/random或/dev/urandom中读到它,那就没有什么区别了,因为这是唯一的区别:2uo.de/myths-about-urandom
- @如果这是真的,那么为什么/dev/random会存在呢?这是有区别的。/dev/urandom重用内部池以生成更多的伪随机位。这意味着输出的熵可能更小。在无头服务器的情况下,内部池的重用更频繁,因此输出的熵更小,因此我的密钥也不那么安全。/新熵的dev/随机块。这个阻塞是一个问题,但我不相信采取简单和不太安全的方法(dev/urandom)。相反,我设置了一个HRNG来确保质量熵的持续供应。
- @用户3335193阅读我链接到的文章,特别是看看这张图片。/dev/random和/dev/urandom的工作方式相同,除了在某些情况下/dev/random块。你说你的hrng足够快,以至于/dev/random永远不会阻塞,如果是这样,那么/dev/random和/dev/uradom将完全相同。除此之外,"熵"的定义不明确,也不重要。
- @如果我错了,Brendanlong会纠正我,但是有3个池,一个源,然后一个用于/dev/urandom,一个用于/dev/random。如果我将hrng中的数据写入/dev/random,这会对/dev/urandom产生什么影响?这是另一个游泳池。至于熵没有被很好地定义,老实说,我不确定你的意思——我认为它被清楚地定义了。至于不重要的,我也不知道你的意思,因为它是任何密码安全系统的主干。
- @用户3335193你真的应该读一下我链接到的文章。他们已经对你所说的一切作出了回应。
这个答案假设你知道你在做什么。在其他情况下,应尽量减少使用/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,那么就有可能将它移植到早期的平台上。源代码毕竟是可用的。
现在,让我们用代码来表示:
我们必须选择要使用的具体实现。为了找到确切的名称,我们用以下行输出所有可用的服务:
然后我们在里面搜索Native,我们发现下面的条目:
1
| SUN : SecureRandom. NativePRNGBlocking -> sun. security. provider. NativePRNG$Blocking |
号
这意味着我们可以像下面这样实例化SecureRandom对象来执行您想要的操作:
一个简单的测试
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。拜托。
- 谢谢您。我还没有代表投票给你。
- @ USSR3535193NVM,我为你投票:D,顺便问一下,你提到的Java 8有什么问题?他们改变了SecureRandom吗?
- @ AlexeyMalev:他们似乎在Java 8中添加了EDCOX1 1。许多人还不能使用Java 8,包括所有Android开发者…
- @用户3335193:您不能投票,但如果您愿意,您可以通过单击投票界面下的绿色复选标记接受答案。(作为提问者,只有你有这个标记。)这给回答者+15,给你+2,并通知社区你的问题已经解决。请注意,每个问题只能接受一个答案——接受一个答案将"不接受"任何其他答案——所以这应该是您认为最有用的答案。因此,在接受之前,您可能需要等待一段时间,看看您是否得到了一个更有用的答案。(完全由你决定。)
- @鲁阿克:因为这个问题上的赞成票,他现在可以反对票了,因为这个特权只需要15的名声,但感谢你写下这段话。:)