Search This Blog

2013-05-01

Java随机数生成器的安全性

1 问题描述

网站通常会需要token,一般都用RNG(实际使用的时候很可能是PRNG)来生成。token十分重要,生成方法的安全性就得仔细考虑及验证了。Jetty 6就犯过错,文章在Jetty Session Id Prediction - www.securityfocus.com

来自java.util.Random的Javadoc:“如果用相同的种子创建两个Random实例,则对每个实例进行相同的方法调用序列,它们将生成并返回相同的数字序列”。使用PRNG算法的java.security.SecureRandom也是一样的。

2 解决方案

提供一个SecureRandom池,token的每一个字符都使用随机(java.util.Random)从池里获得的SecureRandom生成,并且每个SecureRandom在使用一定次数之后重置seed。把一部分SecureRandom替换为java.util.Random也没问题。

3 现成的可供参考的实现

Jetty 6的Session Id实现 - jetty.codehaus.org
Tomcat 7的Session Id实现 - javasourcecode.org
都是直接使用SecureRandom。

4 /dev/urandom

在Linux系统上,SecureRandom默认使用/dev/random,这通常会导致随机数生成得很慢,最简便的一个解决方案:通过设置-Djava.security.egd=file:/dev/./urandom换成/dev/urandom。
参考文章:
Weblogic starts slow - Author: niteartadmin - www.itonguard.com
How do I make Tomcat startup faster? - wiki.apache.org
How to solve performance problem with Java SecureRandom? - stackoverflow.com

=文章版本=

20130223
20130509 改为html格式

No comments:

Post a Comment