我希望咨询关于Java中SecureRandom常见神话的一些问题,即安全与性能的权衡。我在互联网上进行了一段时间的研究,并整理了以下信息。我希望这里的人们可以帮助我确认我的研究成果,并希望能够得到一些有关实际选择实现的想法。基本上,以下是一些最受欢迎和详尽的SecureRandom文章:Proper use of Java's SecureRandom:https://www.synopsys.com/blogs/software-security/proper-use-of-javas-securerandom/; Issues when using Java's SecureRandom:https://www.synopsys.com/blogs/software-security/issues-when-using-java-securerandom/; Using the SecureRandom class:http://moi.vonos.net/java/securerandom/。
现在,如果选择"new SecureRandom()"并将导致不阻塞调用,那么我认为应该为定期重新生成做些什么:
将SecureRandom作为类中的静态实例,并让另一个Executor线程定期调用它的generateSeed(),因此即使调用会阻塞,也不会影响我的应用程序中的主请求处理线程。这样做听起来像个好方法吗?
非常感谢任何Java和加密专家在这里解决这个问题。
编辑: 这里还有另一个有用的线程,似乎支持我的猜测:https://bugs.openjdk.java.net/browse/JDK-4705093
现在Java 8已经发布,Sun官方已经承认了一个bug/混乱,并提出了解决方案:http://openjdk.java.net/jeps/123
但是通过查看文档,我并不确定这个问题是否得到了很好的解决:http://docs.oracle.com/javase/8/docs/api/java/security/SecureRandom.html
因此,根据Amit Sethi的建议,人们应该使用指定实例化方式,例如:SecureRandom sr3 = SecureRandom.getInstance("SHA1PRNG", "SUN")。然而,事实上,Sun告诉我们这将总是从/dev/random中读取(???),这意味着它可能会阻塞每个调用。相反,如果您使用new SecureRandom(),它将始终从/dev/urandom中读取,除非调用generateSeed()。详情请参见:
http://bugs.java.com/view_bug.do?bug_id=6202721
这是否意味着在当前Java中仍然推荐使用"new SecureRandom()"?我找到的其他文档没有明确说明这一点,所以我想知道这是否仍然正确?现在,如果选择"new SecureRandom()"并将导致不阻塞调用,那么我认为应该为定期重新生成做些什么:
将SecureRandom作为类中的静态实例,并让另一个Executor线程定期调用它的generateSeed(),因此即使调用会阻塞,也不会影响我的应用程序中的主请求处理线程。这样做听起来像个好方法吗?
非常感谢任何Java和加密专家在这里解决这个问题。
编辑: 这里还有另一个有用的线程,似乎支持我的猜测:https://bugs.openjdk.java.net/browse/JDK-4705093