【发布时间】:2016-05-26 20:53:46
【问题描述】:
我想知道哪种方法是生成 0-255 范围内高度安全的随机数的最佳方法,而且具有快速性能。在我看来,我肯定必须使用 SecureRandom 类,但我不确定我是否必须使用 .getInstance(SHA1PRNG) 或者最好让它默认而不使用 arg 构造函数。
我介于这两种选择之间:
第一种方式
public class RandomGenerator {
private static final String sha1prng = "SHA1PRNG";
private final SecureRandom csprng;
private final byte[] bytes = new byte[1];
public RandomGenerator() {
try {
csprng = SecureRandom.getInstance(sha1prng);
} catch (NoSuchAlgorithmException e) {
throw new RuntimeException(e);
}
csprng.nextBoolean();
}
protected int generateByte() {
do {
csprng.nextBytes(bytes);
} while (bytes[0] == 0);
return ((byte)(bytes[0] & 0xff) + 256) % 256;
}
}
第二道:
public class SomethingThatNeedsRandomBytes {
private static final int NUMBER_OF_RANDOM_BYTES = ... ;
private final SecureRandom csprng;
SomethingThatNeedsRandomBytes(SecureRandom csprng) {
if (csprng == null)
throw new IllegalArgumentException();
this.csprng = csprng;
}
void doSomethingInvolvingRandomness() {
byte[] bytes = new byte[NUMBER_OF_RANDOM_BYTES];
csprng.nextBytes(bytes);
// Do something with random bytes here.
}
}
我在这个网站上看到了很多其他答案,其中大多数人建议不要使用 SHA1PRNG 并让它默认,但另一方面,其他一些答案建议使用 NativePRNG(我不喜欢它,因为它不快) 或 SHA1PRNG。我想反馈一下哪种方式生成高安全随机数,哪种方式最快。
提前致谢。
【问题讨论】:
-
你真的是在问如何决定,还是只是在问答案是什么?
-
@EJP 我想知道如何决定?好的,我可以使用基准测试或 System.nanoTime () 进行速度性能测试,但我不知道如何确定哪个更安全
标签: java secure-random