Java生成密码安全的伪随机数
示例
Random并且ThreadLocalRandom足够用于日常使用,但是它们有一个大问题:它们基于线性同余生成器,该算法的输出可以很容易地预测。因此,这两个类是不适于密码用途(如密钥生成)。
可以java.security.SecureRandom在需要PRNG输出很难预测的情况下使用。预测此类实例创建的随机数很难将其标记为加密安全类。
import java.security.SecureRandom;
import java.util.Arrays;
public class Foo {
public static void main(String[] args) {
SecureRandom rng = new SecureRandom();
byte[] randomBytes = new byte[64];
rng.nextBytes(randomBytes); //用随机字节(duh)填充randomBytes
System.out.println(Arrays.toString(randomBytes));
}
}除了具有密码安全性之外,SecureRandom其巨大周期为2160,而Randoms周期为248。但是,它的一个缺点是要比Random其他线性PRNG(例如MersenneTwister和Xorshift)慢得多。
请注意,SecureRandom实现既依赖于平台,也依赖于提供者。默认值SecureRandom(由的SUN提供者提供sun.security.provider.SecureRandom):
在类Unix系统上,以/dev/random和和或的数据作为种子/dev/urandom。
在Windows上,以CryptGenRandom()CryptoAPI的调用为种子。
热门推荐
10 儿子立冬祝福语简短独特
11 对当兵的祝福语简短
12 侄儿高考试祝福语简短
13 伴郎红包祝福语朋友简短
14 媳妇生日简短祝福语朋友
15 公司年会祝福语简短最好
16 元旦感恩祝福语简短大全
17 红包祝福语简短10字
18 周六早晨祝福语简短