CryptGenRandom
CryptGenRandom устарел . [ 1 ] криптографически безопасная функция генератора псевдослучайных чисел, включенная в Microsoft CryptoAPI . В программах Win32 Microsoft рекомендует использовать его везде, где требуется генерация случайных чисел. В документе Еврейского университета за 2007 год говорится о проблемах безопасности в реализации CryptGenRandom в Windows 2000 (при условии, что злоумышленник имеет контроль над машиной). Позже Microsoft признала, что те же проблемы существуют в Windows XP , но не в Vista . В середине 2008 года Microsoft выпустила исправление ошибки в пакете обновления 3 для Windows XP. [ 2 ]
Фон
[ редактировать ]API Win32 включает комплексную поддержку криптографической безопасности, включая встроенную поддержку TLS (через API SCHANNEL ) и подписывание кода . Эти возможности основаны на собственных библиотеках Windows для криптографических операций, таких как RSA и AES генерация ключей . Эти библиотеки, в свою очередь, полагаются на криптографически безопасный генератор псевдослучайных чисел (CSPRNG). CryptGenRandom — это стандартный CSPRNG для среды программирования Win32.
Метод работы
[ редактировать ]До Windows Vista
[ редактировать ]предоставляемые Microsoft, Поставщики криптографии, одну и ту же реализацию CryptGenRandom, которая в настоящее время основана на внутренней функции RtlGenRandom используют . [ 3 ] только общий план алгоритма . По состоянию на 2007 год был опубликован [update]:
[ RtlGenRandom ] генерируется, как указано в приложении 3.1 к FIPS 186-2, с SHA-1 в качестве функции G. И с энтропией от:
- Текущий идентификатор процесса (GetCurrentProcessID).
- Текущий идентификатор потока (GetCurrentThreadID).
- Количество тиков с момента загрузки (GetTickCount).
- Текущее время (GetLocalTime).
- Различные высокоточные счетчики производительности (QueryPerformanceCounter).
- Хэш MD4 блока среды пользователя, который включает имя пользователя, имя компьютера и путь поиска. [...]
- Высокоточные внутренние счетчики ЦП, такие как RDTSC, RDMSR, RDPMC
[ опущено: длинные списки полей системной информации низкого уровня и счетчиков производительности ] [ 4 ]
Windows Vista и выше
[ редактировать ]Microsoft довольно подробно задокументировала реализацию генератора случайных чисел Windows 10 в официальном документе, опубликованном в 2019 году. [ 5 ] В Windows 10:
- Существует иерархия генераторов случайных чисел. Ядро имеет «корневой» ГПСЧ, из которого в конечном итоге извлекается вся случайность. Затем ядро использует корневой PRNG для заполнения одного PRNG на каждый логический процессор (поэтому состояние PRNG является локальным для потока и не требует блокировки). Когда процесс запускается, он запрашивает случайные байты из PRNG ядра для каждого процессора, чтобы заполнить свой собственный PRNG процесса. Затем он использует PRNG процесса для заполнения одного буферизованного PRNG на каждый логический процессор. [ 5 ]
- Все вызовы пользовательского пространства для получения случайности, будь то
CryptGenRandom
илиRtlGenRandom
, в конечном итоге упасть доProcessPrng
, который возвращает байты из PRNG для каждого процессора. PRNG всегда использует алгоритм AES-CTR-DRBG, как указано в FIPS SP800-90. ХотяBCryptGenRandom
принимает запросы к более старым алгоритмам для обратной совместимости, он всегда возвращает только случайные числа от каждого процессора. [ 5 ] : 8 - Корневой ГСЧ периодически повторно заполняется из энтропийных пулов. [ 5 ] : 9 При загрузке, когда доступно очень мало энтропии, специальная процедура «начального заполнения» предоставляет начальное значение из исходных файлов, внешней энтропии, случайности TPM , RDRAND, таблицы ACPI-OEM0, энтропии UEFI и текущего времени. [ 5 ] : 11
- Ядро поддерживает несколько пулов энтропии. Несколько источников энтропии объединяются в пулы, основным из которых является время прерывания. [ 5 ] : 12 При использовании пула в качестве выходных данных принимается хэш SHA-512 его содержимого. [ 5 ] : 10 Windows не оценивает энтропию. [ 5 ] : 16
Безопасность
[ редактировать ]Безопасность CSPRNG криптосистемы важна, поскольку она является источником материала динамического ключа. Ключи, необходимые «на лету», такие как ключи сеанса AES TLS, которые защищают сеансы HTTPS с веб-сайтами банка, происходят из CSPRNG. Если эти псевдослучайные числа предсказуемы, сеансовые ключи также предсказуемы. Поскольку CryptGenRandom является фактическим стандартом CSPRNG в средах Win32, его безопасность имеет решающее значение для пользователей Windows.
Особенности алгоритма CryptGenRandom официально не опубликованы. Как и любой неопубликованный алгоритм генерации случайных чисел, он может быть подвержен теоретическим недостаткам, включая использование устаревших алгоритмов и зависимость сбора энтропии от нескольких монотонно увеличивающихся счетчиков, которые могут быть оценены или контролироваться в определенной степени злоумышленником с локальным доступом. в систему.
Криптоанализ
[ редактировать ]Криптоанализ Еврейского университета 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 и указывает на соответствие требованиям EAL4. В результате можно сделать несколько выводов о безопасности алгоритма; EAL4 оценивает продукты на предмет соответствия передовым практикам и заявленным целям безопасности, но редко предполагает углубленный криптоанализ.
Проверка ФИПС
[ редактировать ]![]() | Этот раздел может потребовать очистки Википедии , чтобы соответствовать стандартам качества . Конкретная проблема: неполный список; просто перейти на страницу rngval проще и нажать Ctrl-F для «Microsoft Corp». Действительно ли мы хотим завершить список? Это скучно и однообразно, и все, что он делает, — это демонстрирует соответствие FIPS 186-2. ( Март 2024 г. ) |
Microsoft получила проверку своих реализаций ГСЧ в следующих средах:
- Внедрение RNG для Windows Vista и Server 2008 (сертификат 435) [ 8 ]
- Реализации RNG для Windows Vista (сертификат 321) [ 8 ]
- Поставщик расширенных служб шифрования Windows 2003 (rsaenh.dll) (сертификат 316) [ 8 ]
- Windows 2003 Enhanced DSS и поставщик криптографии Диффи-Хеллмана (dssenh.dll) (сертификат 314) [ 8 ]
- Криптографический модуль режима ядра Windows 2003 (fips.sys) (сертификат 313) [ 8 ]
- Поставщик расширенных служб шифрования Windows CE и Windows Mobile (rsaenh.dll) (сертификат 292) [ 8 ]
- Поставщик расширенных служб шифрования Windows CE и Windows Mobile (rsaenh.dll) (сертификат 286) [ 8 ]
- Расширенный поставщик шифрования Windows CE (rsaenh.dll) (сертификат 66) [ 8 ]
Эти тесты «предназначены для проверки соответствия различным утвержденным спецификациям ГСЧ, а не для проверки их соответствия различным утвержденным спецификациям ГСЧ». чем обеспечить меру безопасности продукта. [...] Таким образом, валидацию не следует интерпретировать как оценку или В результате можно сделать несколько выводов о безопасности алгоритма; оценки FIPS не обязательно проверяют исходный код или оценивают способ генерации начальных чисел RNG. [ 9 ]
В списке проверки RNG содержится следующее уведомление: «С 1 января 2016 года в соответствии с SP800-131A Revision 1 Transitions: Рекомендации по переходу к использованию криптографических алгоритмов и длин ключей использование RNG, указанных в FIPS 186-2 , [X9.31] и версия [X9.62] 1998 года больше не одобряются. Этот список предоставлен в исторических целях. только." [ 10 ]
Альтернативы
[ редактировать ]уровень API
[ редактировать ]У разработчиков Windows есть несколько альтернативных способов доступа к функциональности CryptGenRandom; эти альтернативы используют один и тот же алгоритм и имеют одни и те же характеристики безопасности, но могут иметь и другие преимущества.
Использование RtlGenRandom
[ редактировать ]Исторически мы всегда советовали разработчикам не использовать такие функции, как rand, для генерации ключей, одноразовых номеров и паролей, а использовать такие функции, как CryptGenRandom, которые создают криптографически безопасные случайные числа. Проблема с CryptGenRandom заключается в том, что вам нужно подключить CryptoAPI (CryptAcquireContext и тому подобное), что нормально, если вы используете другие функции шифрования.
При установке Windows XP по умолчанию и более поздних версиях CryptGenRandom вызывает функцию с именем ADVAPI32!RtlGenRandom, которая не требует загрузки всего содержимого CryptAPI. Фактически, новая функция Whidbey CRT rand_s вызывает RtlGenRandom. [ 11 ]
Использование RNGCryptoServiceProvider
[ редактировать ]Программистам, использующим .NET, следует использовать класс RNGCryptoServiceProvider. [ 12 ]
Использование API криптографии: следующее поколение (CNG)
[ редактировать ]СПГ [ 13 ] является долгосрочной заменой устаревшего Crypto API. Он предоставляет эквивалентную функцию BCryptGenRandom. [ 14 ] а также специальные функции для генерации ключей.
Языки программирования
[ редактировать ]- функция библиотеки Microsoft C++ rand_s использует RtlGenRandom и рекомендована Microsoft для безопасных приложений. [ 15 ]
- функция Python в urandom в модуле os , которая использует /dev/urandom системах, вызывает CryptGenRandom в Unix-подобных системах Windows. [ 16 ]
- Поставщик Java JCA "SunMSCAPI", доступный в дистрибутивах OpenJDK и Oracle JRE в Windows, предоставляет реализацию SecureRandom с именем алгоритма Windows-PRNG. Этот класс перенаправляет все запросы на случайные или начальные байты, а также устанавливает дополнительные начальные байты в собственный CryptGenRandom. [ 17 ]
См. также
[ редактировать ]- Системные вызовы, обеспечивающие энтропию – приблизительный эквивалент CryptGenRandom в OpenBSD и ядре Linux.
- /dev/random – источник случайности в большинстве Unix-подобных ядер.
- Атака на генератор случайных чисел
Ссылки
[ редактировать ]- ^ Функция CryptGenRandom (Windows) «Важно: этот API устарел. Новое и существующее программное обеспечение должно начать использовать API криптографии следующего поколения. Microsoft может удалить этот API в будущих выпусках». (Это уведомление относится ко всему CryptoAPI.)
- ^ «Microsoft подтверждает, что XP содержит ошибку генератора случайных чисел» . Архивировано из оригинала 22 июня 2008 г.
- ^ Функция RtlGenRandom (Windows)
- ^ Ховард, Майкл; Леблан, Дэвид (2003). Написание безопасного кода, второе издание . Пирсон Образование. ISBN 0-7356-1722-8 .
- ^ Перейти обратно: а б с д и ж г час Фергюсон, Нильс (октябрь 2019 г.). «Инфраструктура генерации случайных чисел Windows 10» (PDF) . скачать.microsoft.com .
- ^ Перейти обратно: а б «Идентификаторы алгоритма CNG (Bcrypt.h) — приложения Win32» . Learn.microsoft.com . 13 апреля 2023 г.
Примечание. Начиная с Windows Vista с пакетом обновления 1 и Windows Server 2008, генератор случайных чисел основан на режиме счетчика AES, указанном в стандарте NIST SP 800-90. [...] Windows 10: Начиная с Windows 10, алгоритм генератора случайных чисел с двойной эллиптической кривой был удален. Существующие варианты использования этого алгоритма будут продолжать работать; однако генератор случайных чисел основан на режиме счетчика AES, указанном в стандарте NIST SP 800-90.
- ^ Доррендорф, Лео; Цви Гаттерман; Бенни Пинкас. «Криптоанализ генератора случайных чисел операционной системы Windows» (PDF) . Архивировано из оригинала (PDF) 18 мая 2012 г. Проверено 12 ноября 2007 г.
- ^ Перейти обратно: а б с д и ж г час «Список проверки ГСЧ» . Отдел компьютерной безопасности НИСТ . Проверено 20 марта 2024 г.
- ^ «Система проверки генератора случайных чисел (RNGVS)» (PDF) . Отдел компьютерной безопасности Национального института стандартов и технологий. 31 января 2005 г. Архивировано из оригинала (PDF) 24 февраля 2013 г. . Проверено 18 июня 2013 г.
- ^ «Программа проверки криптографического алгоритма: список проверки rng» .
- ^ Веб-журнал Майкла Ховарда: Криптографически безопасное случайное число в Windows без использования CryptoAPI.
- ^ «Архивная копия» . Архивировано из оригинала 8 сентября 2006 г. Проверено 27 августа 2007 г.
{{cite web}}
: CS1 maint: архивная копия в заголовке ( ссылка ) - ^ Crypto API следующего поколения (Windows)
- ^ BCryptGenRandom (Windows)
- ^ http://msdn.microsoft.com/en-us/library/sxtz2fa8(VS.80).aspx Центр разработчиков Visual C++. , rand_s
- ^ https://docs.python.org/2/library/os.html#os.urandom Справочник по библиотеке Python, модуль ОС
- ^ http://docs.oracle.com/javase/8/docs/technotes/guides/security/SunProviders.html#SunMSCAPI Техническая документация Oracle Java SE 8, Sun Providers