SecureRandom setSeed方法在MacOS上失败

时间:2018-06-11 20:39:45

标签: java macos secure-random

运行macOS High Sierra 10.13.5和Java 1.8.0u171。

我有类似下面的代码:

free

运行时遇到以下异常,我编写了一些包含敏感位的堆栈跟踪:

SecureRandom random = SecureRandom.getInstance("NativePRNGNonBlocking");
random.setSeed(bla byte array);

看起来它正试图写点什么,但我不知道是什么,或者在哪里。该区域中的代码提到/ dev / random,所以我想我会查看其中的权限,但我不知道该怎么做。

java.security.ProviderException: setSeed() failed
    at sun.security.provider.NativePRNG$RandomIO.implSetSeed(NativePRNG.java:472)
    at sun.security.provider.NativePRNG$RandomIO.access$300(NativePRNG.java:331)
    at sun.security.provider.NativePRNG$NonBlocking.engineSetSeed(NativePRNG.java:312)
    at java.security.SecureRandom.setSeed(SecureRandom.java:427)
--redacted--
Caused by: java.io.IOException: Operation not permitted
    at java.io.FileOutputStream.writeBytes(Native Method)
    at java.io.FileOutputStream.write(FileOutputStream.java:313)
    at sun.security.provider.NativePRNG$RandomIO.implSetSeed(NativePRNG.java:470)
    at sun.security.provider.NativePRNG$RandomIO.access$300(NativePRNG.java:331)
    at sun.security.provider.NativePRNG$NonBlocking.engineSetSeed(NativePRNG.java:312)
    at java.security.SecureRandom.setSeed(SecureRandom.java:427)
--redacted--

任何想法是什么问题,以及我可以做些什么来补救它?

编辑:我发现似乎x@y:~ $ ls -ld /dev/null crw-rw-rw- 1 root wheel 3, 2 Jun 11 15:25 /dev/null x@y:~ $ ls -ld /dev/urandom crw-rw-rw- 1 root wheel 14, 1 Jun 11 15:02 /dev/urandom x@y:~ $ ls -ld /dev/random crw-rw-rw- 1 root wheel 14, 0 Jun 7 08:15 /dev/random 似乎试图访问OSX显然不允许写入的NativePRNGNonBlocking。有没有办法让我可以写入它,或者另一种避免这种情况的方法,同时仍然保持非阻塞行为?

2 个答案:

答案 0 :(得分:1)

标准种子应该已经提供了足够的熵。

另请参阅:Should I seed a SecureRandom?

如果您仍然喜欢自己的种子,抱歉我无法提供如何写入OSX / dev / urandom的答案。

出于安全目的,/ dev / urandom不是最佳选择,/ dev / random或SecureRandom的默认种子可能是更好的解决方案。

编辑:有些人认为/ dev / urandom也很好: https://www.2uo.de/myths-about-urandom/

答案 1 :(得分:0)

我可以在Oracle JDK 1.8.0-152上重现该问题,但是该问题似乎在Oracle JDK 1.8.0-202中已解决

另请参阅https://bugs.java.com/bugdatabase/view_bug.do?bug_id=JDK-8156709

相关问题