Следует ли использовать SecureRandom в качестве одиночного или новый объект должен создаваться каждый раз, когда генерируется случайное число? - PullRequest
0 голосов
/ 20 февраля 2020

Я использую SecureRandom для генерации случайных чисел.

Имеет ли какое-либо значение предсказуемость следующего сгенерированного числа, если объект SecureRandom является одиночным или каждый раз создается новый объект генерируется случайное число?

Синглтон:

public RequestIdGenerator {
    private static SecureRandom secureRandom = new SecureRandom();

    public static int generateRequestId() {
        secureRandom.nextInt(100_000_000);
    }
}

против

Новый объект для каждого время генерируется случайное число:

public RequestIdGenerator {

    public static int generateRequestId() {
        new SecureRandom().nextInt(100_000_000);
    }
}

Этот вопрос возник после прочтения о этого ответа , относящегося к «Предсказуемости линейных конгруэнтных генераторов».

1 Ответ

2 голосов
/ 27 марта 2020

Следует ли использовать SecureRandom в качестве синглтона или каждый раз, когда генерируется случайное число, следует создавать новый объект?

Не следует создавать много экземпляров SecureRandom. Это дорого и может истощить источник энтропии (случайности) вашей системы.

Если у вас кончится энтропия, создание SecureRandom может блокироваться в системном вызове ... в ожидании ... для ... больше энтропии, которую нужно собрать.

Имеет ли это какое-либо значение в отношении предсказуемости?

Это не должно иметь никакого значения для предсказуемости. Если вы рассматриваете отобранный SecureRandom как черный ящик, не будет возможности предсказать следующее число , если вы не знаете семя и предыдущую историю генератора.

Предостережение является то, что ошибочная реализация безопасного генератора случайных чисел может фактически не быть безопасной. (Но с другой стороны, энтропия, которую вы используете для создания семян, может быть не такой случайной, как вы думаете ...).

Этот вопрос возник после прочтения о ... «Предсказуемость линейных Конгруэнтные генераторы.

LCG принципиально не безопасны. Вы не можете использовать один для SecureRandom реализации.

javado c содержит ссылки на требования к любой реализации SecureRandom. Если у вас есть практические проблемы, прочитайте ссылки.

...