CryptGenRandom — устаревшая [1] криптографически безопасная функция генератора псевдослучайных чисел , которая включена в Microsoft CryptoAPI . В программах Win32 Microsoft рекомендует использовать ее везде, где требуется генерация случайных чисел. В статье 2007 года из Еврейского университета были высказаны предположения о проблемах безопасности в реализации CryptGenRandom для Windows 2000 (при условии, что злоумышленник контролирует машину). Позднее Microsoft признала, что те же проблемы существуют в Windows XP , но не в Vista . Microsoft выпустила исправление ошибки с Windows XP Service Pack 3 в середине 2008 года. [2]
Win32 API включает в себя комплексную поддержку криптографии через Microsoft CryptoAPI , набор криптографических примитивов, предоставляемых Microsoft для использования в приложениях Windows. Технологии Windows, такие как поддержка TLS (через Schannel API) и подпись кода, полагаются на эти примитивы, которые в свою очередь полагаются на криптографически безопасный генератор псевдослучайных чисел (CSPRNG). — стандартный CSPRNG, поставляемый с Microsoft CryptoAPI.CryptGenRandom
Поставщики криптографии , предоставляемые Microsoft, используют одну и ту же реализацию CryptGenRandom
, в настоящее время основанную на внутренней функции, называемой RtlGenRandom
. [3] По состоянию на 2007 год был опубликован только общий план алгоритма[обновлять] :
[ RtlGenRandom ] генерирует, как указано в приложении 3.1 к стандарту FIPS 186-2, с использованием SHA-1 в качестве функции G. И с энтропией из:
- Текущий идентификатор процесса (GetCurrentProcessID).
- Текущий идентификатор потока (GetCurrentThreadID).
- Количество тактов с момента загрузки (GetTickCount).
- Текущее время (GetLocalTime).
- Различные высокоточные счетчики производительности (QueryPerformanceCounter).
- Хэш MD4 блока среды пользователя, который включает имя пользователя, имя компьютера и путь поиска. [...]
- Высокоточные внутренние счетчики ЦП, такие как RDTSC, RDMSR, RDPMC
[ пропущено: длинные списки полей системной информации низкого уровня и счетчиков производительности ] [4]
Microsoft довольно подробно описала реализацию генератора случайных чисел в Windows 10 в техническом документе, опубликованном в 2019 году. [5] В Windows 10:
CryptGenRandom
или RtlGenRandom
, в конечном итоге попадают в ProcessPrng
, который возвращает байты из PRNG процесса на процессор. PRNG всегда использует алгоритм AES-CTR-DRBG, как указано в FIPS SP800-90. Хотя BCryptGenRandom
он принимает запросы на более старые алгоритмы для обратной совместимости, он всегда возвращает только случайные числа из PRNG на процессор. [5] : 8 Безопасность CSPRNG криптосистемы имеет решающее значение, поскольку она является источником динамического ключевого материала. Ключи, необходимые «на лету», такие как ключи сеанса TLS , защищающие соединения HTTPS , происходят из CSPRNG. Если эти псевдослучайные числа предсказуемы, ключи сеанса также предсказуемы. Поскольку CryptGenRandom
это фактический стандарт CSPRNG в средах Win32, его безопасность имеет решающее значение для пользователей Windows.
Криптоанализ CryptGenRandom, опубликованный в ноябре 2007 года Лео Доррендорфом и другими из Еврейского университета в Иерусалиме и Хайфского университета , выявил существенные уязвимости в реализации алгоритма для Windows 2000. [7]
Чтобы воспользоваться уязвимостью, злоумышленнику сначала нужно будет скомпрометировать программу, запускающую генератор случайных чисел. Все уязвимости в статье зависят от того, что злоумышленник выкачивает биты состояния из генератора. Злоумышленник, который может выполнить эту атаку, обычно уже может обойти любой генератор случайных чисел (например, он может просто перехватить выходные данные генератора или исправить их в памяти до известных значений). Однако команда Еврейского университета отмечает, что злоумышленнику нужно украсть биты состояния только один раз, чтобы постоянно нарушать безопасность экземпляра CryptGenRandom. Они также могут использовать собранную ими информацию для определения прошлых сгенерированных случайных чисел, потенциально скомпрометировав информацию, такую как номера кредитных карт, которые уже были отправлены.
Атаки в статье основаны на том факте, что CryptGenRandom использует потоковый шифр RC4 , который может быть запущен в обратном направлении, как только его состояние станет известно. Они также используют тот факт, что CryptGenRandom работает в пользовательском режиме , позволяя любому, кто получает доступ к операционной системе на уровне пользователя, например, эксплуатируя переполнение буфера , получить информацию о состоянии CryptGenRandom для этого процесса. Наконец, CryptGenRandom обновляет свое начальное число из энтропии нечасто. Эта проблема усугубляется тем фактом, что каждый процесс Win32 имеет свой собственный экземпляр состояния CryptGenRandom; хотя это означает, что компрометация одного процесса не транзитивно компрометирует все остальные процессы, она также может увеличить долговечность любого успешного взлома.
Поскольку детали алгоритма CryptGenRandom в то время не были публичными, команда Доррендорфа использовала инструменты обратного проектирования , чтобы понять, как работает алгоритм. Их статья является первой опубликованной записью того, как работает криптографический генератор случайных чисел Windows [ требуется цитата ] .
Windows 2000, XP и 2003 успешно прошли оценки EAL4+, включая реализации CryptGenRandom() и FIPSGenRandom(). Документация Security Target доступна на портале Common Criteria Portal и указывает на соответствие требованиям EAL4. В результате можно сделать несколько выводов о безопасности алгоритма; EAL4 оценивает продукты по лучшим практикам и заявленным целям безопасности, но редко включает в себя глубокий криптоанализ.
Этот раздел может потребовать очистки для соответствия стандартам качества Википедии . Конкретная проблема: неполный список; проще просто перейти на страницу rngval и нажать Ctrl-F для "Microsoft Corp". Мы действительно хотим завершить список? Он скучный и повторяющийся, и все, что он делает, это показывает соответствие FIPS 186-2. ( Март 2024 ) |
Компания Microsoft получила подтверждение своих реализаций ГСЧ в следующих средах:
Эти тесты «предназначены для проверки соответствия различным утвержденным спецификациям RNG, а не для оценки безопасности продукта. [...] Таким образом, валидация не должна интерпретироваться как оценка или одобрение общей безопасности продукта». В результате можно сделать несколько выводов о безопасности алгоритма; оценки FIPS не обязательно проверяют исходный код или оценивают способ генерации начальных чисел RNG. [9]
Список проверки ГСЧ содержит следующее уведомление: «С 1 января 2016 года в соответствии с SP800-131A Revision 1 Transitions: Recommendation for Transitioning the Use of Cryptographic Algorithms and Key Lengths, использование ГСЧ, указанных в FIPS 186-2, [X9.31] и версии 1998 года [X9.62], больше не одобряется. Этот список предоставляется только в исторических целях». [10]
Разработчики Windows имеют несколько альтернативных способов доступа к функциональности CryptGenRandom; эти альтернативы используют тот же алгоритм и имеют те же характеристики безопасности, но могут иметь и другие преимущества.
Если для вашей программы требуется обратная совместимость вплоть до Windows XP, можно вызвать функцию Windows API RtlGenRandom
(которая находится в advapi32.dll
[3] ) для генерации безопасных случайных данных, как показано ниже. Если это не проблема, программа должна использовать BCryptGenRandom
вместо этого более новый вызов.
Исторически мы всегда говорили разработчикам не использовать такие функции, как rand, для генерации ключей, одноразовых чисел и паролей, вместо этого они должны использовать такие функции, как CryptGenRandom, которая создает криптографически безопасные случайные числа. Проблема с CryptGenRandom заключается в том, что вам нужно подключить CryptoAPI (CryptAcquireContext и т. д.), что нормально, если вы используете другие криптофункции.
В Windows XP и более поздних версиях по умолчанию CryptGenRandom вызывает функцию с именем ADVAPI32!RtlGenRandom, которая не требует загрузки всего CryptAPI. Фактически, новая функция Whidbey CRT, rand_s, вызывает RtlGenRandom. [11]
Программистам, использующим .NET, следует использовать класс RNGCryptoServiceProvider. [12]
CNG [13] — это долгосрочная замена устаревшему Crypto API. Он предоставляет эквивалентную функцию BCryptGenRandom [14] , а также специальные функции для генерации ключей.
rand_s
используется RtlGenRandom
для генерации криптографически безопасных случайных чисел. [11]SunMSCAPI
JCA , доступный в дистрибутивах OpenJDK и Oracle JRE на Windows, предоставляет реализацию SecureRandom с именем алгоритма Windows-PRNG. Этот класс перенаправляет все запросы на случайные или начальные байты, а также устанавливает дополнительные начальные байты в CryptGenRandom. [16]Примечание: начиная с Windows Vista с пакетом обновления 1 (SP1) и Windows Server 2008, генератор случайных чисел основан на режиме счетчика AES, указанном в стандарте NIST SP 800-90. [...] Windows 10: начиная с Windows 10, алгоритм генератора случайных чисел на основе двойной эллиптической кривой был удален. Существующие варианты использования этого алгоритма продолжат работать; однако генератор случайных чисел основан на режиме счетчика AES, указанном в стандарте NIST SP 800-90.
{{cite web}}
: CS1 maint: архивная копия как заголовок ( ссылка )