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