关于java:SecureRandom setSeed方法在MacOS上失败

SecureRandom setSeed method fails on MacOS

运行MACOS高Sierra 103.5和Java1.80U171。

我有如下代码:

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

每当运行此操作时,我遇到以下异常,我已对包含一些敏感位的堆栈跟踪进行了修订:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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--

它似乎想写点什么,但我不知道在哪写。在这个区域中有提到/dev/random的代码,所以我想我会检查它的排列,但我也不知道该如何处理。

1
2
3
4
5
6
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

有什么想法吗?问题是什么?我能做些什么来补救?

编辑:我发现似乎NativePRNGNonBlocking试图访问/dev/urandom,而osx显然不允许写入。有没有一种方法可以让我写它,或者另一种在保持非阻塞行为的同时避免这种情况的方法?


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

另请参见:我应该种子一个SecureRandom吗?

如果你仍然喜欢你自己的种子,对不起,我不能提供一个答案,如何写信给osx/dev/urandom。

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

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


我可以在OracleJDK1.8.0-152上复制这个问题,但这个问题似乎在OracleJDK1.8.0-202中得到了解决。

另请参见https://bugs.java.com/bugdatabase/view_bug.do?错误ID=JDK-8156709