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 |
有什么想法吗?问题是什么?我能做些什么来补救?
编辑:我发现似乎
标准种子应该已经提供了足够的熵。
另请参见:我应该种子一个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