Как предсказать следующий 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 - это текущая дата/время. Если вы случайно получаете два из них последовательно, то вы можете определить, как быстро они создаются, и поэтому с уверенностью предсказывают последовательность.