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

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

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

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

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

Ответ 1

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

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

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

Ответ 2

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

Ответ 3

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

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

Ответ 4

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

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

UUIDv1 состоит из:

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

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

Некоторое программное обеспечение генерирует UUIDv1 (идентификаторы панелей Grafana, списки Airbnb и т.д.), Но некоторое программное обеспечение полагается на случайные UUID, UUIDv4.

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

Как недавно продемонстрировал Николай "denish" Денищенко (Kaspersky), получив отладку доступа к процессу, генерирующему 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/

Ответ 5

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