Отказ от ответственности: я не криптограф.
Не думайте, что 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 байт для дополнительной безопасности.
Дополнительная информация: