CryptGenRandom

CryptGenRandom

CryptGenRandom — функция криптографически стойкого генератора псевдослучайных чисел. Она включена включена в Microsoft’s Cryptographic Application Programming Interface. Microsoft рекомендует использовать её во всех Win32 программах, где требуется генерация случайных чисел. В 2007 году в работе из Еврейского университета были указаны проблемы в реализации CryptGenRandom под Windows 2000 (предполагая наличие доступа к машине у криптоаналитика). Позднее в Microsoft установили, что эти проблемы также присутствуют и в Windows XP, а в Windows Vista их уже не наблюдалось. Эти ошибки были исправлены с выходом Windows XP Service Pack 3 в середине 2008 года.[1]

Содержание

Предпосылки

Win32 API полностью поддерживает методы защиты от криптографических атак, включая TLS и цифровую подпись. Эта поддержка основана на родных для Windows библиотеках для решения таких криптографических задач как генерация ключей для алгоритмов RSA или AES. Эти библиотеки используют криптографически стойкий генератор псевдослучайных чисел. CryptGenRandom является стандартным генератором подобного рода для среды разработки под Win32.

Алгоритм

Microsoft используют одну реализацию CryptGenRandom, основанную на некоторой встроенной функции «RtlGenRandom».[2] В 2007 годы был обнародован лишь общий набросок работы этого алгоритма:

[RtlGenRandom] создает как указано в FIPS 186-2 приложение 3.1, используя SHA-1 в качестве G-функции. Источниками для энтропии являются:

  • ID текущего процесса.
  • ID текущей нити исполнения.
  • Число тактов с момента последней загрузки.
  • Текущее время.
  • Различные высокоточные счётчики.
  • Хэш-функции MD4 от персональных данных пользователя, таких как логин, имя компьютера, и др.
  • Высокоточные внутрипроцессорные счётчиков, таких как RDTSC, RDMSR, RDPMC.

[опущено: длинный список низкоуровневых информационных элементов и счётчиков] Источник: Writing Secure Code, Second Edition. isbn=0-7356-1722-8.

Безопасность

Криптографическая устойчивость генераторов случайных чисел очень важна, поскольку такие генераторы напрямую участвуют в создании динамических ключей. Ключи, потребность в которых возникает «на лету» (например, сеансовые ключи AES TLS для защиты HTTPS сессий на банковских сайтах), также вычисляются с помощью этих генераторов. Таким образом предсказуемость поведения генераторов напрямую позволяет предсказывать значения создаваемых ключей. Поскольку CryptGenRandom является, по факту, стандартным генератором в среде Win32, то его защищенность критически важна для пользователей Windows.

Особенности алгоритма CryptGenRandom официально не опубликованы. Как и любой неопубликованный алгоритм генерации случайных чисел, CryptGenRandom может быть теоретически уязвим из-за использования устаревших алгоритмов или, например, использования нескольких монотонных счётчиков для подсчета энтропии, которые могут быть использованы криптоаналитиком при наличии доступа к системе.

Криптоанализ (Еврейский университет)

В 2007 году Leo Dorrendorf совместно с группой учёных из Еврейского университета и Хайфского университета опубликовал результаты криптоанализа CryptGenRandom, выявив значительные уязвимости в реализации алгоритма под Window 2000.[3]

Для того чтобы воспользоваться этими уязвимостями злоумышленнику необходимо подвергнуть опасности запущенную программу, которая использует этот генератор случайных чисел. Все недостатки CryptGenRandom зависят от сифонирования битов состояний генератора. Если злоумышленник в состоянии выполнить эту атаку, то с большой долей вероятности он может сломать любой генератор случайных чисел (например, он может просто повторять выходные значения генератора или исправлять их непосредственно в памяти на уже известные величины). Тем не менее учёные из Еврейского университета установили, что криптоаналитику необходимо всего лишь один раз узнать биты состояний для того чтобы нанести серьёзный удар по безопасности CryptGenRandom. После этого злоумышленник может использовать информацию о битах состояний для получения чисел, сгенерированных алгоритмом на во время предыдущих запусков, и тем самым получить доступ к потенциально важной информации, например, к уже отправленным номерам кредитных карт. Это возможно в связи с тем, что CryptGenRandom использует потоковый шифр RC4, который является обратимым в случае хотя бы одного известного состояния. Было замечено, что CryptGenRandom работает в пользовательском режиме, что позволяет любому, кто имеет доступ к операционной системе на пользовательском уровне получить информацию о состоянии CryptGenRandom для этого процесса, например, используя переполнение буфера. Наконец, CryptGenRandom довольно редко обновляет источники для вычисления энтропии. Проблема усугубляется тем фактом, что каждый win32 процесс имеет свой собственный экземпляр состояний CryptGenRandom. Такая независимость процессов только увеличивает время несанкционированного использования системы после успешного взлома. Анализ группы учёных под руководством Dorrendorf’а по сути является первой опубликованной работой о функционировании криптостойкого генератора случайных чисел под Windows.

Common Criteria

Windows 2000, XP и Windows 2003, включая реализации CryptGenRandom() и FIPSGenRandom(), успешно прошли тесты EAL4+. Проверка безопасности алгоритмов выявила полное соответствие требуемым нормам EAL4, документация доступна на портале Common Criteria. Отсюда можно сделать вывод о том, что зарекомендовавшая себя система поверки EAL4 работает хорошо в большинстве случаев, но не включает в себя более глубокий криптоанализ.

FIPS проверки

Следующие реализации генераторов случайных чисел Microsoft были успешно протестированы: Windows Vista (сертификат 321) Windows 2003 Enhanced Cryptographic Provider (rsaenh.dll) (сертификат 316) Windows 2003 Enhanced DSS and Diffie-Hellman Cryptographic Provider (dssenh.dll) (сертификат 314) Windows 2003 Kernel Mode Cryptographic Module (fips.sys) (сертификат 313) Windows CE and Windows Mobile Enhanced Cryptographic Provider (rsaenh.dll) (сертификат 292) Windows CE and Windows Mobile Enhanced Cryptographic Provider (rsaenh.dll) (сертификат 286) Windows CE Enhanced Cryptographic Provider (rsaenh.dll) (сертификат 66)

Эти тесты «предназначены для проверки соответствия различным утвержденным спецификациям генераторов случайных чисел, а не для оценки уровня безопасности продукции. […] Таким образом проверка не должна быть истолкована как оценка или одобрение общей безопасности продукции». Отсюда можно сделать выводы о том, что такие проверки могут обходить стороной некоторые особенности генераторов случайных чисел (например, используемые группой ученых из Еврейского университета).[4]

Исходный код

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

Разборка (Disassembly)

Библиотеки для платформ Windows можно разобрать с помощью таких инструментов как IDA Pro и odjdumb. Кроме того, в отличие от большинства поставщиков программ с закрытым исходным кодом, Microsoft предоставляет отладочные символы для своих бинарных файлов. В результате, эти файлы часто оценивают сторонние практики. Упомянутая выше атака Dorrendorf’а базировалась именно на таких разборках.

Альтернативные средства

API уровень

Разработчики Windows имеют несколько альтернативных средств доступа к функциям CryptGenRandom. Эти варианты вызывают тот же алгоритм, имеют тот же уровень безопасности, но возможно имеют и другие преимущества.

Использование RtlGenRandom

«Исторически, мы всегда говорили разработчикам не использовать такие функции как rand() для генерации ключей и паролей. Гораздо лучше использовать функции вроде CryptGenRandom, которые являют криптографически устойчивыми генераторами случайных чисел. Проблема с использованием именно CryptGenRandom связана с подключением CryptoAPI (CryptAcquireContext и подобные), хотя остальные функции работают с CryptoAPI нормально. По умолчанию в Windows XP CryptGenRandom вызывает функцию ADVAPI32!RtlGenRandom, которая не требует подключения все набора CryptAPI. На самом деле, новая функция Whidbey CRT rand_s() вызывает RtlGenRandom»[5]

Использование RNGCryptoServiceProvider

Программисты, пользующиеся .Net, должны использовать класс RNGCryptoServiceProvider.[6]

Языки программирования

  • рекомендуется использовать функцию rand_s из библиотеки Microsoft С++ (основана на RtlGenRandom).[7]
  • функция urandom языка Python в операционных системах Windows вызывает CryptGenRandom.[8]

См. также

Примечания

Ссылки


Wikimedia Foundation. 2010.

Игры ⚽ Поможем написать реферат

Полезное


Смотреть что такое "CryptGenRandom" в других словарях:

  • CryptGenRandom — is a cryptographically secure pseudorandom number generator function that is included in Microsoft s Cryptographic Application Programming Interface. In Win32 programs, Microsoft recommends its use anywhere random number generation is needed. A… …   Wikipedia

  • /dev/random — In Unix like operating systems, /dev/random is a special file that serves as a random number generator or as a pseudorandom number generator. It allows access to environmental noise collected from device drivers and other sources.[citation… …   Wikipedia

  • Pseudorandom number generator — A pseudorandom number generator (PRNG), also known as a deterministic random bit generator (DRBG),[1] is an algorithm for generating a sequence of numbers that approximates the properties of random numbers. The sequence is not truly random in… …   Wikipedia

  • Cryptographically secure pseudorandom number generator — A cryptographically secure pseudo random number generator (CSPRNG) is a pseudo random number generator (PRNG) with properties that make it suitable for use in cryptography. Many aspects of cryptography require random numbers, for example: Key… …   Wikipedia

  • Random number generator attack — The security of cryptographic systems depends on some secret data that is known to authorized persons but unknown and unpredictable to others. To achieve this unpredictability, some randomization is typically employed. Modern cryptographic… …   Wikipedia

  • Random password generator — A random password generator is software program or hardware device that takes input from a random or pseudo random number generator and automatically generates a password. Random passwords can be generated manually, using simple sources of… …   Wikipedia

  • Random number generation — A random number generator (often abbreviated as RNG) is a computational or physical device designed to generate a sequence of numbers or symbols that lack any pattern, i.e. appear random. Computer based systems for random number generation are… …   Wikipedia

  • Cryptographic API — The Cryptographic Application Programming Interface (also known variously as CryptoAPI, Microsoft Cryptography API, or simply CAPI) is an application programming interface included with Microsoft Windows operating systems that provides services… …   Wikipedia

  • List of random number generators — Computer random number generators are important in mathematics, cryptography and gambling. This list includes all common types, regardless of quality.Pseudorandom number generators (PRNGs)The following algorithms are pseudorandom number… …   Wikipedia

  • Entropy (computing) — In computing, entropy is the randomness collected by an operating system or application for use in cryptography or other uses that require random data. This randomness is often collected from hardware sources, either pre existing ones such as… …   Wikipedia


Поделиться ссылкой на выделенное

Прямая ссылка:
Нажмите правой клавишей мыши и выберите «Копировать ссылку»