Java生成随机数的方法耳熟能详,但怎样才是安全的方式呢。
在生成随机数时,所用的种子seed尽量熵大,而普通操作的熵都比较小。错误的生成seed方法:这种方法的seed熵很小。容易被黑客猜到生成的方式。
Date now = new Date();
Long seed = now.toInstant().toEpochMilli();
正确的生成seed的方法,获得尽量大的熵,用RandomSecure获得:
import javax.validation.Valid;
import java.nio.ByteBuffer;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.util.Map;
import java.util.Random;
public static void main(String[] args) throws NoSuchAlgorithmException {
SecureRandom instance = SecureRandom.getInstance("SHA1PRNG");
byte[] bytes = instance.generateSeed(8); # 使用generateSeed来获得seed
Random random = new Random();
ByteBuffer buffer = ByteBuffer.allocate(8);
buffer.put(bytes, 0, bytes.length);
buffer.flip();
long aLong = buffer.getLong();
random.setSeed(aLong);
System.out.println("seed: " + aLong + " random: " + random.nextLong());
}