Использует ли UuidCreate CSPRNG?
Обратите внимание, что это не мое приложение, это приложение, которое я pentesting для клиента. Обычно я задаю такие вопросы на https://security.stackexchange.com/, однако, поскольку это больше связано с программированием, я спросил здесь.
Предоставлено RFC 4122 для UUID не указывает, что UUID типа 4 должны быть сгенерированы криптографически защищенным генератором псевдослучайных чисел (CSPRNG). Он просто говорит
Установите все остальные биты произвольно (или псевдослучайно) значения.
Хотя некоторые реализации алгоритма, такие как этот в Java, используют CSPRNG.
Я пытался понять, работает ли реализация Microsoft или нет. В основном, как генерирует их .NET или MSSQL Server.
Проверяя .NET source, мы можем увидеть этот код:
Marshal.ThrowExceptionForHR(Win32Native.CoCreateGuid(out guid), new IntPtr(-1));
return guid;
Проверяя CoCreateGuid
docco, он указывает
Функция CoCreateGuid вызывает функцию RPC UuidCreate
Все, что я могу узнать об этой функции, здесь. Кажется, я дошел до конца кроличьей дыры.
Теперь, есть ли у кого-нибудь информация о том, как UuidCreate
генерирует свои UUID?
Я видел много связанных сообщений:
В первом из них говорится:
GUID не гарантирует гарантии случайности, он делает гарантии вокруг уникальности. Если вы хотите случайность, используйте Random для создания строка.
Я согласен с этим, кроме как в моем случае для случайных, непредсказуемых чисел вы, конечно, используете CSPRNG вместо Random
(например, RNGCryptoServiceProvider
).
И последнее утверждает (фактически цитируется из Википедии):
Криптоанализ генератора GUID WinAPI показывает, что, поскольку последовательность идентификаторов GUID V4 является псевдослучайной; учитывая полное знание внутреннее состояние, можно предсказать предыдущие и последующие Значения
Теперь, с другой стороны забора этот пост от Will Dean говорит
В прошлый раз, когда я изучал это (несколько лет назад, возможно, XP SP2), я шагнул в код ОС, чтобы увидеть, что было на самом деле происходит, и он генерирует случайное число с безопасным генератор случайных чисел.
Конечно, даже если в настоящее время он использует CSPRNG, это будет специфичным для реализации и может быть изменено в любой момент (например, любое обновление для Windows). Маловероятно, но теоретически возможно.
Моя точка зрения заключается в том, что для этого нет канонической ссылки, выше было продемонстрировать, что я сделал свое исследование, и ни одна из вышеупомянутых сообщений не ссылается на что-либо авторитетное.
Причина в том, что я пытаюсь решить, нужно ли менять систему, использующую GUID для токенов аутентификации. С точки зрения чистого дизайна, ответ является определенным да, однако с практической точки зрения, если функция Windows UuidCreate
действительно использует Infrastructure CSPRNG, тогда нет непосредственной угрозы для системы, Может ли кто-нибудь пролить свет на это?
Я ищу ответы с уважаемым источником, чтобы поддержать его.
Ответы
Ответ 1
Хотя я все еще просто парень в Интернете, я только что повторил упражнение по вступлению в UuidCreate в 32-битном приложении, работающем на 64-разрядной версии Windows 10.
Вот немного стека из частичного процесса:
> 0018f670 7419b886 bcryptPrimitives!SymCryptAesExpandKeyInternal+0x7f
> 0018f884 7419b803 bcryptPrimitives!SymCryptRngAesGenerateSmall+0x68
> 0018f89c 7419ac08 bcryptPrimitives!SymCryptRngAesGenerate+0x3b
> 0018f8fc 7419aaae bcryptPrimitives!AesRNGState_generate+0x132
> 0018f92c 748346f1 bcryptPrimitives!ProcessPrng+0x4e
> 0018f93c 748346a1 RPCRT4!GenerateRandomNumber+0x11
> 0018f950 00dd127a RPCRT4!UuidCreate+0x11
Довольно ясно, что он использует RNG на основе AES для генерации чисел. GUID, созданные при вызове функций генерации GUID других людей, по-прежнему не подходят для использования в качестве неопроверенных токенов auth, поскольку это не цель функции генерации GUID - вы просто используете побочный эффект.
Ваш "Маловероятно, но теоретически возможно". об изменениях в реализации между версиями ОС скорее дано ложь этим утверждением в документах для "UuidCreate":
Если вам не нужен этот уровень безопасности, ваше приложение может использовать функцию UuidCreateSequential, которая ведет себя точно так же, как и функция UuidCreate для всех других версий операционной системы.
то есть. он был более предсказуемым, теперь он менее предсказуем.