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

Является ли UUID.randomUUID() подходящим для использования в качестве одноразового пароля?

Как предыдущий обсужденный, письма с подтверждением должны иметь уникальный (практически) недопустимый код - по существу одноразовый пароль - в ссылке подтверждения.

Документы UUID.randomUUID() говорят:

UUID генерируется с использованием криптографически сильного псевдослучайного генератор чисел.

Означает ли это, что случайный генератор UUID в правильно реализованной JVM подходит для использования в качестве уникального (практически) недопустимого OTP?

4b9b3361

Ответ 1

Нет. В соответствии с спецификацией UUID:

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

Кроме того, UUID имеют только 16 возможных символов (от 0 до F). Вы можете создать гораздо более компактный и явно защищенный случайный пароль, используя SecureRandom (благодаря @erickson).

import java.security.SecureRandom;
import java.math.BigInteger;

public final class PasswordGenerator {
    private SecureRandom random = new SecureRandom();

    public String nextPassword() {
        return new BigInteger(130, random).toString(32);
    }
}

Ответ 2

если вы читаете RFC, который определяет UUID и который связан с документами API, вы увидите, что не все биты UUID являются на самом деле случайные ( "вариант" и "версия" не являются случайными). поэтому UUID типа 4 (тот тип, который вы намереваетесь использовать), если он будет реализован правильно, должен иметь 122 бита (безопасной для этой реализации) случайной информации из общего размера 128 бит.

так что да, он будет работать, а также 122-битное случайное число от "защищенного" генератора. но более короткое значение может содержать достаточное количество случайности и может быть проще для пользователя (возможно, я единственный старомодный человек, который все еще читает электронную почту в терминале, но URL-адреса подтверждения, которые обертывают строки, раздражают....).

Ответ 3

Да, использование java.util.UUID в порядке. Там не так много, что нужно сказать.

Здесь мое предложение:

  • Отправьте пользователю ссылку с огромным паролем в качестве аргумента URL.
  • Когда пользователь нажимает на ссылку, напишите свой сервер, чтобы он определил, правильно ли указан аргумент и что пользователь вошел в систему.
  • Недействительный UUID через 24 часа после его выпуска.

Это потребует некоторой работы, но это необходимо, если вы действительно заботитесь о создании надежной и надежной системы.

Ответ 4

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

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

UUID также являются длинными строками (128 бит, а затем обычно Base64 (22 символа) или Base16 (32 символа)) - подумайте о том, насколько удобна ваша система. Лично я бы использовал CSRNG, чтобы выбрать 8 буквенно-цифровых символов случайным образом и вернуть их.

Ответ 5

Точка случайного кода для ссылки подтверждения заключается в том, что злоумышленник не должен угадывать и прогнозировать значение. Как вы можете видеть, чтобы найти правильный код для вашей ссылки подтверждения, UUID длиной в 128 бит дает 2 ^ 128 различных возможных кодов, а именно 340 282 366 920 938 463 463 374 607 431 768 211 456 возможных кодов, которые нужно попробовать. Я думаю, что ваша ссылка на подтверждение не для запуска ядерного оружия, не так ли? Это достаточно сложно для злоумышленника. Это безопасно.

- обновить -

Если вы не доверяете криптографически сильному генератору случайных чисел, вы можете добавить еще несколько непредсказуемых параметров с кодом UUID и хешировать их. Например,

code = SHA1 (UUID, Process PID, идентификатор потока, номер порта локального соединения, температура процессора)

Это еще труднее предсказать.

Ответ 6

Я думаю, что это должно быть подходящим, поскольку оно генерируется случайным образом, а не с любого конкретного ввода (т.е. вы не кормите его именем пользователя или чем-то подобным) - поэтому несколько вызовов этого кода будут давать разные результаты. Он утверждает, что его 128-битный ключ, поэтому его достаточно долго, чтобы непрактично разорваться.

Вы собираетесь использовать этот ключ для шифрования значения, или вы ожидаете использовать его в качестве фактического пароля? Независимо от того, вам нужно будет повторно интерпретировать ключ в формате, который может быть введен с клавиатуры. Например, выполните преобразование Base64 или Hex или каким-либо образом сопоставьте значения с альфа-числами, иначе пользователь будет пытаться ввести значения байтов, которые не существуют на клавиатуре.

Ответ 7

Он идеально подходит как один раз пароль, так как даже я реализовал то же самое для приложения, на котором я работаю. Более того, ссылка, которую вы поделили, говорит все.