Разница между java.util.Random и java.security.SecureRandom

Моей команде передали несколько код на стороне сервера (на Java), который генерирует случайные токены, и у меня есть вопрос относительно того же —

Назначение этих токенов довольно чувствительно — используется для идентификатора сеанса, ссылок для сброса пароля и т. д. Поэтому они должны быть криптографически случайными чтобы кто-то не угадал их или не взломал их. Маркер является «длинным», поэтому он имеет длину 64 бита.

В настоящее время код использует класс java.util.Randomдля создания этих токенов. В документациидля java.util.Randomчетко указано следующее:

Экземпляры java.util.Random не являются криптографически безопасными. Вместо этого рассмотрите возможность использования SecureRandom, чтобы получить криптографически безопасный генератор псевдослучайных чисел для использования приложениями, чувствительными к безопасности.

Однако в настоящее время код использует java.util.Randomтак: он создает экземпляр класса java.security.SecureRandom, а затем использует SecureRandom. nextLong()для получения начального значения, используемого для создания экземпляра класса java.util.Random. Затем он использует метод java.util.Random.nextLong()для создания токена.

Итак, теперь мой вопрос: все еще небезопасно, учитывая, что java.util.Randomзаполняется с помощью java.security.SecureRandom? Нужно ли модифицировать код, чтобы он использовал java.security.SecureRandomисключительно для создания токенов?

В настоящее время начальным кодом является Случайныйодин раз при запуске

200
задан Pshemo 9 September 2019 в 02:40
поделиться