Лучшие практики для генерации токенов SessionId / Authentication - PullRequest
18 голосов
/ 09 марта 2011

Я видел людей, использующих UUID для генерации токенов аутентификации. Однако в RFC 4122 указано, что

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

Мне было интересно, какие алгоритмы используются, например, в Java и .NET для генерации SessionId / AuthenticationToken. Действительно ли UUID не подходит для этих целей в приложении, которое требует более чем средних требований безопасности?

Ответы [ 2 ]

7 голосов
/ 27 сентября 2011

UUID генерация случайная, но случайная с плохой энтропией означает, что вы получите легко угадываемые UUID с.Если вы используете хороший генератор случайных чисел, вы можете генерировать UUID s, которые можно использовать для сеансов.Однако, выгода заключается в том, что UUID не имеют встроенной защиты от повторного воспроизведения, вмешательства, фиксации и т. Д., Вы должны справиться с этим самостоятельно (читай: UUID сам по себе не долженсчитается действительным идентификатором сеанса сам по себе).Тем не менее, вот хороший фрагмент о том, как сгенерировать безопасный UUID, используя python:

Уникальный идентификатор сеанса в python

0 голосов
/ 21 июня 2019

Отказ от ответственности: я не криптограф.


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

Хотя в целом это так, следует также отметить, что некоторые системы генерируют UUID с использованием криптографически стойких псевдо-кодов.генераторы случайных чисел (например, Java ):

public static UUID randomUUID()

Статическая фабрика для получения UUID типа 4 (псевдослучайно сгенерированного).UUID генерируется с использованием криптографически сильного генератора псевдослучайных чисел.

Возвращает :
Случайно сгенерированный UUID


Мне было интересно, какие алгоритмы используются, например, в Java и .NET для генерации SessionId / AuthenticationToken.

Tomcat не использует UUID в качестве токенов сеанса, но использует SHA1PRNG безопасный генератор случайных чисел для создания идентификаторов сеансов:

/**
 * The name of the algorithm to use to create instances of
 * {@link SecureRandom} which are used to generate session IDs. If no
 * algorithm is specified, SHA1PRNG is used. To use the platform default
 * (which may be SHA1PRNG), specify the empty string. If an invalid
 * algorithm and/or provider is specified the {@link SecureRandom} instances
 * will be created using the defaults. If that fails, the {@link
 * SecureRandom} instances will be created using platform defaults.
 */
private String secureRandomAlgorithm = "SHA1PRNG";

Это просто значение по умолчанию, и вы можете предоставить свой собственный генератор идентификаторов сеансов, реализовав интерфейс org.apache.catalina.SessionIdGenerator.

Кромеиспользуя случайно сгенерированную строку в идентификаторе сеанса, стандартная реализация также добавляет jvmRoute к идентификаторам сеансов, которые она генерирует:

Идентификатор маршрутизации для этого экземпляра Tomcat.Он будет добавлен к идентификатору сеанса для обеспечения возможности маршрутизации без сохранения состояния с помощью балансировщиков нагрузки.Детали того, как jvmRoute будет включен в id, зависят от реализации.См. Стандартное выполнение для поведения по умолчанию.

Сила SHA1PRNG уже обсуждалась здесь .

Действительно ли UUID не подходит для этих целейв приложении, которое требует более чем средних требований безопасности?

UUID Java почти так же безопасны, как генератор идентификаторов сеансов Tomcat по умолчанию, который генерирует 16-байтовые длинные идентификаторы сеансов:

Tomcat :

/** Number of bytes in a session ID. Defaults to 16. */
private int sessionIdLength = 16;

java.util.UUID в OpenJDK 7 :

public static UUID randomUUID() {
    SecureRandom ng = numberGenerator;
    if (ng == null) {
        numberGenerator = ng = new SecureRandom();
    }

    byte[] randomBytes = new byte[16];
    ng.nextBytes(randomBytes);
    randomBytes[6]  &= 0x0f;  /* clear version        */
    randomBytes[6]  |= 0x40;  /* set to version 4     */
    randomBytes[8]  &= 0x3f;  /* clear variant        */
    randomBytes[8]  |= 0x80;  /* set to IETF variant  */
    return new UUID(randomBytes);
}

Новы можете настроить генератор идентификаторов сеансов Tomcat на использование более 16 байт для дополнительной безопасности.

Дополнительная информация:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...