生成可预测的安全随机数
Generating Predictable Secure Random Numbers
我如何实例化一个可预测且安全的随机数生成器,它会在 Java 个版本和操作系统中生成一致的随机数?
以下代码曾经在 Java 8 中工作,但在 Java 10 中不再工作:
import java.security.SecureRandom;
public class PredictableRandom {
public static void main(String[] args) {
PredictableRandom predictableRandom = new PredictableRandom();
predictableRandom.execute();
}
private void execute() {
SecureRandom secureRandom = new SecureRandom();
System.out.println(secureRandom.getAlgorithm());
System.out.println(secureRandom.getProvider());
long seed = 12345678L;
secureRandom.setSeed(seed);
System.out.println(secureRandom.nextLong());
SecureRandom secureRandom2 = new SecureRandom();
secureRandom2.setSeed(seed);
System.out.println(secureRandom2.nextLong());
}
}
在Java8-好,不同的随机对象生成相同的随机数:
SHA1PRNG
SUN version 1.8
3325995872096263519
3325995872096263519
在Java10 - 不好,不同的随机对象生成不同的随机数:
DRBG
SUN version 10
-3526685326322256981
-2373261409119309182
您想要做的是使用旧算法使用 SecureRandom.getInstance.
获取安全随机实例
示例代码如下。你应该考虑天气与否,这是你真正想要的行为。
public void example() throws NoSuchAlgorithmException {
{
SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG");
secureRandom.setSeed(12345678L);
System.out.println(secureRandom.nextLong());
}
{
SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG");
secureRandom.setSeed(12345678L);
System.out.println(secureRandom.nextLong());
}
}
这吐槽:
3325995872096263519
3325995872096263519
正如您所寻找的那样。
我如何实例化一个可预测且安全的随机数生成器,它会在 Java 个版本和操作系统中生成一致的随机数?
以下代码曾经在 Java 8 中工作,但在 Java 10 中不再工作:
import java.security.SecureRandom;
public class PredictableRandom {
public static void main(String[] args) {
PredictableRandom predictableRandom = new PredictableRandom();
predictableRandom.execute();
}
private void execute() {
SecureRandom secureRandom = new SecureRandom();
System.out.println(secureRandom.getAlgorithm());
System.out.println(secureRandom.getProvider());
long seed = 12345678L;
secureRandom.setSeed(seed);
System.out.println(secureRandom.nextLong());
SecureRandom secureRandom2 = new SecureRandom();
secureRandom2.setSeed(seed);
System.out.println(secureRandom2.nextLong());
}
}
在Java8-好,不同的随机对象生成相同的随机数:
SHA1PRNG
SUN version 1.8
3325995872096263519
3325995872096263519
在Java10 - 不好,不同的随机对象生成不同的随机数:
DRBG
SUN version 10
-3526685326322256981
-2373261409119309182
您想要做的是使用旧算法使用 SecureRandom.getInstance.
获取安全随机实例示例代码如下。你应该考虑天气与否,这是你真正想要的行为。
public void example() throws NoSuchAlgorithmException {
{
SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG");
secureRandom.setSeed(12345678L);
System.out.println(secureRandom.nextLong());
}
{
SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG");
secureRandom.setSeed(12345678L);
System.out.println(secureRandom.nextLong());
}
}
这吐槽:
3325995872096263519
3325995872096263519
正如您所寻找的那样。