【问题标题】:SecureRandom setSeed method fails on MacOSSecureRandom setSeed 方法在 MacOS 上失败
【发布时间】:2018-11-21 04:09:26
【问题描述】:

运行 macOS High Sierra 10.13.5 和 Java 1.8.0u171。

我有类似下面的代码:

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

每次运行时都会遇到以下异常,我已经编辑了一些包含一些敏感位的堆栈跟踪:

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 的代码,所以我想我会检查它的权限,但我也不知道该怎么做。

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 似乎试图访问 OSX 显然不允许写入的/dev/urandom。有没有一种方法可以启用对它的写入,或者有另一种方法可以在保持非阻塞行为的同时避免这种情况?

【问题讨论】:

  • 如果您使用SecureRandom.getInstance("SHA1PRNG", "SUN"),您是否仍然看到问题?假设 MacOS 仅用于非关键开发工作。
  • 我似乎没有遇到任何问题。作为补救步骤,如果 os.name 包含“Mac Os”,我已更改代码以将其设置为该算法。考虑到我们的 linux 系统仍将使用 NativePRNGNonBlocking,这是一个不太理想的解决方案。
  • 最好区分开发环境和生产环境。因为我不确定os.name 是否足够可靠。万一被黑了怎么办?
  • 是的,这可能是我将采取的方法,现在我知道罪魁祸首是什么。我不确定如何启用对 urandom 的写访问,因此更好的方法是在此处添加一个环境检查(我们已经有环境),以选择算法,而不是要求 Mac 上的每个人都添加对 urandom 的写访问(假设它可能)。感谢您的信息。
  • 或者使用容器。

标签: java macos secure-random


【解决方案1】:

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

另请参阅:Should I seed a SecureRandom?

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

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

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

【讨论】:

  • 我认为在 Mac OS 上,/dev/urandom/dev/random 都连接到同一个 PRNG。
【解决方案2】:

我可以在 Oracle JDK 1.8.0-152 上重现该问题,但该问题似乎在 Oracle JDK 1.8.0-202 中得到修复

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-15
    • 2017-01-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多