Насколько детерминированы идентификаторы .Net GUID?

StackOverflow https://stackoverflow.com/questions/1402696

  •  05-07-2019
  •  | 
  •  

Вопрос

Вчера я спросил Безопасны ли идентификаторы GUID, созданные в Windows 2003, для использования в качестве идентификаторов сеанса? и ответ в сочетании с в сочетании с этой статьей Идентификаторы GUID глобально уникальны, но подстроки идентификаторов GUID не являются побудило меня задуматься о замене моего текущего механизма использования GUID в качестве идентификатора сеанса в файлах cookie.

Поскольку внесение этого изменения требует небольшой работы, я решил запустить быстрый тест GUID на моем компьютере с Vista, чтобы проверить, была ли последовательность GUID явно детерминированной (меня беспокоит то, что если злоумышленник смог получить последовательность GUID, сгенерированную моим сервером, он сможет сгенерировать новые соответствующие идентификаторы).

В статье Рэймонда Чена (которая ссылается на эту очень старую спецификацию UUID и GUID - коды с 1998) GUID состоит из:

  • 60 бит временной метки,
  • 48 бит компьютерного идентификатора,
  • 14 бит uniquifier, и
  • шесть битов фиксированы

Исходя из этого, если я сгенерирую 10 идентификаторов GUID, то первые 15 символов ASCII (исключая '-') будут меткой времени, следующие 12 символов ASCII будут идентификатором компьютера, следующие 3,5 символа ASCII будут случайными, а последние 1,5 символа - фиксированными.

Получение 10 идентификаторов GUID на моем компьютере с Vista с использованием .Net System.Guid.NewGuid() выдает:

b4e95ead-3619-4dc2-9102-cf7ab0efd927
a45ee719-decd-46b2-8355-7becbe406f74
9af68d75-35a0-4907-b6ab-f15e33acfe96
bed88fa3-3209-4a19-97dd-85d5428ea5f4
123cb39b-8d81-41c6-8894-f1257a8f7606
e2b1f6b1-5791-4a18-80a9-5dc668574ecb
c52aa660-2629-4659-bb83-5583081e5a1c
76eda32d-ceda-412e-8ade-30c47416e954
cbc4d45e-7281-40d2-9f90-00539b04fe98
be36524c-267c-4791-bc9e-3c20b29d7615

Единственная заметная закономерность при быстром визуальном осмотре заключается в том, что 13-й символ ASCII всегда равен 4.

Мне снова остается задаться вопросом, достаточно ли полагаться на System.Guid для генерации псевдослучайных идентификаторов сеанса, чтобы защитить веб-приложение, где взлом идентификатора сеанса стоил бы не более тысячи долларов?

Обновить:Вместо использования GUID теперь я планирую сгенерировать идентификатор моего сеанса, используя приведенный ниже подход.Я преобразую 384-битное случайное число в строку размером 0x00 байт, чтобы оно подходило для использования в HTTP cookie.

RNGCryptoServiceProvider rngProvider = new RNGCryptoServiceProvider();
byte[] myKey = new byte[48];
rngProvider.GetBytes(myKey);
string sessionID = null;
myKey.ToList().ForEach(b => sessionID += b.ToString("x2"));
Console.WriteLine(sessionID);
Это было полезно?

Решение

Это не полный ответ, но я могу сказать вам, что 13-я шестнадцатеричная цифра всегда равна 4, потому что она обозначает версию алгоритма, используемого для генерации GUID (id est, v4).;кроме того, и я цитирую Википедию:

Криптоанализ WinAPI GUID генератор GUID показывает, что, поскольку последовательность GUID V4 псевдослучайна, учитывая начальное состояние, можно предсказать до следующих 250 000 GUID возвращается функцией UuidCreate.Вот почему идентификаторы GUID не следует использовать в криптографии, например, в качестве случайных ключей.

Остальная часть статьи и ссылки на нее: http://en.wikipedia.org/wiki/Guid

--Редактировать--

С точки зрения безопасности я бы посоветовал вам сгенерировать свой идентификатор сеанса так, как вам заблагорассудится, а затем криптографически подписать его;таким образом, вы можете ввести любую информацию, какую захотите, а затем просто поставить подпись в конце - возможной проблемой является компромисс между размером / силой вашего ключа и результирующим размером файла cookie.Идентификаторы GUID полезны в качестве идентификаторов, но я бы полагался только на специальный криптографический метод для обеспечения безопасности.

Другие советы

Я предлагаю вам использовать Система.Безопасность.Криптография.Генератор случайных чисел.Это предназначено для получения чисел, которые не могут быть подвергнуты обратному проектированию.Мотивация Guid - быть уникальным.Вы могли бы объединить как GUID, так и защищенное случайное число, но 128-битное защищенное случайное число никогда не столкнется на практике.

Некоторые заметки:

  1. Я сомневаюсь, что какая-либо реализация GUID была разработана так, чтобы быть криптографически безопасной.(И это предположение было бы подтверждено статьей, на которую дана ссылка для следующего пункта.)
  2. 13 - й символ ASCII является обозначением какой алгоритм был использован для генерации GUID.

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

Что ты пытаешься сделать?Вам нужен просто источник случайных чисел?

Проверьте random.org и горячие кусочки.Много-много лет назад у меня была библиотека Java, которая собирала числа из этих источников и объединяла их вместе, чтобы получить довольно красивую случайную серию (хотя предполагается, что эти два сайта находятся не в cahootz).

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

По той же причине, по которой вы не хотели бы использовать GUID в качестве ключа AES, вы не хотите использовать их для любого типа конфиденциальных идентификаторов.

GUID работает чрезвычайно хорошо для того, для чего они предназначены:Математически гарантированный уникальный идентификатор, который никогда не повторится.

Даже если взлом идентификатора сеанса стоит всего 1000 долларов, представьте, что это делается 100 раз.Теперь ты говоришь о серьезных побрякушках.

Я знаю, что это простой способ использовать GUID, но сопротивляйтесь и справляйтесь с трудностями, принимая надлежащие меры предосторожности для адекватной защиты вашего приложения.Ваши пользователи будут вам благодарны.

Получить дубликат guid практически невозможно, учитывая возможности его получения.Вот несколько кратких математических фактов

Песчинки в мире 75,000,000,000,000,000,000

Количество идентификаторов GUID 340,282,366,920,938,463,463,374,607,431,770,000,000

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top