Как предсказать следующий GUID из данного GUID?

Я отправил 10000 писем нашим клиентам, и каждое письмо имело ссылку в формате

http://example.com/LogIn?key={guid}

К сожалению guid Я послал случайные направляющие (тестовые данные, сгенерированные Guid.NewGuid()) поэтому все клиенты получили недействительные ссылки...

Основываясь на 404-х годах, которые я получаю от веб-сервера, у меня есть несколько руководств, которые я разослал. Я читал, что генератор guid в Windows слаб, поэтому вы можете предсказать следующий guid из того, который у вас уже есть. Кто-нибудь знает как? Если бы я мог это сделать, я мог бы сделать направленные мной инструкции действительными, чтобы ссылки снова заработали.

5 ответов

То, как Windows генерировала идентификаторы GUID, несколько раз менялось, и многие, казалось бы, надежные советы в Интернете совершенно неверны (возможно, просто устарели, а может быть, всегда совершенно неверны).

В последний раз, когда я изучал это (несколько лет назад, вероятно, XP SP2), я вошел в код операционной системы, чтобы увидеть, что на самом деле происходит, и он генерировал случайное число с помощью безопасного генератора случайных чисел.

Я сомневаюсь, что вам повезет с прогнозированием одного GUID из другого, если вы сгенерировали их по умолчанию.

Прежде всего вам нужно знать, соответствуют ли они RFC4122, и вам нужно получить версию.

Если это UUIDv1, вы можете предсказать их

UUIDv1 состоит из:

  • Отметка времени (интервалы 100 нс с эпохи григорианского календаря)
  • Версия (1) клев
  • Два (или три, lol) бита для соответствия RFC4122 (это приводит к тому, что клев находится в [89ab])
  • Идентификатор часов (случайные биты)
  • Идентификатор узла (постоянная 6-байтовая маска)

Вам просто нужно перебрать возможные временные метки. Осторожно, есть много интервалов по 100 нс!

Некоторые программы генерируют UUIDv1 (идентификаторы информационных панелей Grafana, списки Airbnb и т. Д.), Но некоторые программы используют случайные UUID, UUIDv4.

Если это UUIDv4, вы можете украсть контекст PRNG

Как недавно показал Николай "denish" Денищенко (Касперский), имея отладочный доступ к процессу, генерирующему UUID, можно украсть текущие контексты RC4 и воспроизвести в другом месте до 500000 UUID. Это было продемонстрировано (привет, Уилл Дин) в Microsoft Windows XP, в которой использовался забавный механизм 8*RC4 и который был засеян с фактической энтропией каждые 500000 UUID.

В Windows 10 (это не совсем версия Windows, а скорее.NET Framework или версия rpcrt4.dll), это уже не RC4, а AES, предположительно используемый в режиме CTR. По-видимому, существует то же самое повторное использование энтропии.

Для получения дополнительной информации, проверьте работу, которую я сделал там https://uuid.pirate-server.com/blog/

Существует несколько различных типов направляющих. Тип 1 использует идентификатор хоста - обычно это MAC-адрес - порядковый номер, а также текущую дату и время. Тип 4 полностью случайный. Если это UUID типа 1, вы, вероятно, сможете определить довольно ограниченный набор вероятных UUID, но даже в этом случае вы не сможете сгенерировать одну последовательность UUID, поэтому вы не сможете определить конкретный UUID для конкретного пользователя.

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

Лучше всего здесь просто добавить ручное перенаправление с любого несоответствующего GUID на общую страницу, которая либо объясняет, что пошло не так, либо просто программно выясняет, где они должны были оказаться, и отправляет их туда.

Частью GUID является текущая дата / время. Если вам посчастливилось получить два из них последовательно, то вы можете сказать, как быстро они создаются, и, следовательно, предсказать последовательность с большой уверенностью.

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