Подтвердить что ты не робот

Безопасна ли безопасность SecureRandom?

Является ли SecureRandom потоком безопасным? То есть после инициализации он может получить доступ к следующему случайному числу, чтобы быть потокобезопасным? Изучение исходного кода, похоже, показывает, что оно есть, и этот отчет об ошибках, как представляется, указывает на то, что отсутствие документации как потокобезопасное является проблемой javadoc. Кто-нибудь подтвердил, что на самом деле это потокобезопасно?

4b9b3361

Ответ 1

Да, это так. Он расширяет Random, который всегда выполнял поточную реализацию de facto, и из Java 7 явно гарантирует безопасность потоков.

Если во многих потоках используется один SecureRandom, может возникнуть проблема, которая ухудшает производительность. С другой стороны, инициализация экземпляра SecureRandom может быть относительно медленной. Лучше всего использовать глобальный RNG или создать новый для каждого потока, будет зависеть от вашего приложения. Класс ThreadLocalRandom может использоваться как шаблон для предоставления решения, поддерживающего SecureRandom.

Ответ 2

Текущая реализация SecureRandom является потокобезопасной, в частности, два мутирующих метода nextBytes(bytes[]) и setSeed(byte[]) синхронизируются.

Ну, насколько я мог сказать, все мутирующие методы в конечном итоге маршрутизируются через эти два метода, а SecureRandom переопределяет несколько методов в Random, чтобы гарантировать это. Это работает, но может быть хрупким, если реализация будет изменена в будущем.

Лучшее решение - сначала синхронизировать вручную в экземпляре SecureRandom. Это означает, что каждый стек вызовов будет приобретать два замка на одном и том же объекте, но обычно это очень дешево на современных JVM. То есть, нет никакого вреда в явной синхронизации. Например:

    SecureRandom rnd = ...;

    byte[] b = new byte[NRANDOM_BYTES];
    synchronized (rnd) {
        rnd.nextBytes(b);
    }

Ответ 3

Да. Он полностью потокобезопасен. На самом деле, я бы жаловался, что замок слишком агрессивный. Весь engineNextBytes() синхронизирован.

Чтобы быть откровенным с вами, я не знаю, не безопасно ли оно. Проблема с потоками, вероятно, вводит больше случайности:)