Моя команда получила серверный код (на 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
исключительно для генерации токенов?
В настоящее время код запускает Random
один раз при запуске