Генерация предсказуемых безопасных случайных чисел - PullRequest
0 голосов
/ 22 сентября 2018

Как создать экземпляр предсказуемого и безопасного генератора случайных чисел, который будет генерировать согласованные случайные числа в версиях 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());
}
}

В Java 8 - хорошо, разные случайные объекты генерируют одно и то же случайное число:

SHA1PRNG
SUN version 1.8
3325995872096263519
3325995872096263519

В Java 10 - плохо, разные случайные объекты генерируют другое случайное число:

DRBG
SUN version 10
-3526685326322256981
-2373261409119309182

1 Ответ

0 голосов
/ 22 сентября 2018

То, что вы хотите сделать, это получить экземпляр безопасного случайного числа, используя старый алгоритм, используя 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

Так же, как вы искали.

...