Насколько легко вы можете угадать GUID, который может быть сгенерирован?

GUID очень часто используются при создании сеансовых ключей для веб-приложений. Я всегда задавался вопросом о безопасности этой практики. Поскольку GUID генерируется на основе информации с компьютера и времени, а также нескольких других факторов, насколько сложно угадать вероятные GUID, которые появятся в будущем. Допустим, вы запустили 1000 или 10000 новых сеансов, чтобы получить хороший набор сгенерированных идентификаторов GUID. Будет ли это проще для создания GUID, который может быть использован для другого сеанса. Вам даже не нужно угадывать конкретный GUID, а просто пытаться использовать GUID, который может быть сгенерирован в определенный период времени.

6 ответов

Решение

Веб-приложения.NET вызывают Guid.NewGuid() для создания GUID, который, в свою очередь, в конечном итоге вызывает COM-функцию CoCreateGuid () на пару кадров глубже в стеке.

Из библиотеки MSDN:

Функция CoCreateGuid вызывает функцию RPC UuidCreate, которая создает GUID, глобально уникальное 128-битное целое число. Используйте функцию CoCreateGuid, когда вам нужен абсолютно уникальный номер, который вы будете использовать в качестве постоянного идентификатора в распределенной среде. Для очень высокой степени уверенности эта функция возвращает уникальное значение - без других вызовов, в той же или любой другой системе. (в сети или нет), должен вернуть то же значение.

И если вы проверите страницу на UuidCreate:

Функция UuidCreate генерирует UUID, который нельзя отследить по адресу Ethernet/ Token Ring компьютера, на котором он был создан. Он также не может быть связан с другими UUID, созданными на том же компьютере.

Последнее содержит предложение является ответом на ваш вопрос. Поэтому я бы сказал, что довольно сложно догадаться, если в реализации Microsoft нет ошибки.

Вот некоторые вещи из Википедии ( первоисточник):

GUID V1, которые содержат MAC-адрес и время, могут быть идентифицированы с помощью цифры "1" в первой позиции третьей группы цифр, например {2f1e4fc0-81fd-11da-9156-00036a0f876a}.

В моем понимании, они этого не скрывают.

GUID V4 использует более поздний алгоритм, который является псевдослучайным числом. Они имеют "4" в том же положении, например {38a52be4-9352-453e-af97-5c3b448652f0}. Более конкретно, битовая комбинация "data3" будет иметь вид 0001xxxxxxxxxxxx в первом случае и 0100xxxxxxxxxxxx во втором случае. Криптоанализ генератора WinAPI GUID показывает, что, поскольку последовательность GUID V4 псевдослучайна, с учетом начального состояния можно предсказать до 250 000 GUID, возвращаемых функцией UuidCreate 1. Вот почему GUID не должны использоваться в криптографии, например, в качестве случайных ключей.

GUID гарантированно будут уникальными, и это все. Не гарантировано быть случайным или трудно угадать.

Чтобы ответить на ваш вопрос, по крайней мере для алгоритма генерации GUID V1, если вы знаете алгоритм, MAC-адрес и время создания, вы, вероятно, могли бы сгенерировать набор GUID, один из которых был бы тем, который был фактически сгенерирован. И MAC-адрес, если это GUID V1, может быть определен из образцов GUID с той же машины.

Дополнительный кусочек из википедии:

Указанный OSF алгоритм генерации новых идентификаторов GUID подвергся широкой критике. В этих (V1) GUID MAC-адрес сетевой карты пользователя используется в качестве основы для последней группы цифр GUID, что означает, например, что документ может быть отслежен обратно на компьютер, который его создал. Эта дыра в секретности использовалась при поиске создателя червя Мелисса. Большинство других цифр основаны на времени генерации GUID.

Если кто-то продолжит использовать сервер с непрерывным потоком идентификаторов GUID, это будет скорее атака типа "отказ в обслуживании", чем что-либо еще.

Вероятность того, что кто-то угадает GUID, равна нулю.

Зависит. Трудно, если GUID настроены разумно, например, с использованием соленых безопасных хэшей, и у вас много битов. Это слабо, если GUID короткие и очевидные.

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

"Идентификаторы GUID гарантированно будут уникальными, и это все". GUID не гарантируется быть уникальным. По крайней мере, сгенерированные CoCreateGuid: "С очень высокой степенью достоверности эта функция возвращает уникальное значение - никакие другие вызовы в той же или любой другой системе (сетевой или нет) не должны возвращать такое же значение".

Другие вопросы по тегам