Обработка паролей

Учетные данные пользователя и пароля остаются общими для проверки подлинности, даже если более надежные методы, такие как сертификаты, биометрические данные и ключи доступа становятся более распространенными. Ключи шифрования и другие секреты также требуют защиты. Программные системы должны обеспечивать безопасную обработку этих учетных данных, чтобы предотвратить их кражу, атаки повторного воспроизведения и горизонтальное перемещение злоумышленников.

Warning

Никогда не жестко кодировать пароли, ключи API, строки подключения или другие секреты в исходном коде. Жестко закодированные секреты извлекаются злоумышленниками с помощью декомпилеров, проверки памяти или утечки исходного кода. Это одна из наиболее распространенных уязвимостей учетных данных, эксплуатируемых в дикой природе.

Important

Завершив использование паролей или секретов в памяти, немедленно перезаписать буфер путем вызова SecureZeroMemory. В отличие от memset, компилятор не может удалить SecureZeroMemory в ходе оптимизации, что гарантирует фактическую очистку секретных данных.

Современное управление учетными данными

Для новой разработки на Windows используйте следующие подходы в порядке предпочтения:

  1. По возможности исключите пароли. Используйте Windows Hello, секретные ключи (FIDO2/WebAuthn) или проверку подлинности на основе сертификатов, чтобы избежать обработки паролей в целом.
  2. Используйте диспетчер учетных данных Windows. Вызовите CredWrite и CredRead для хранения и получения учетных данных в хранилище учетных данных ОС, который шифрует их с помощью ключа сеанса входа пользователя.
  3. Используйте DPAPI для локального хранилища секретов. Вызовите CryptProtectData для шифрования секретов, которые должны храниться локально. DPAPI связывает шифрование с учетной записью пользователя или компьютером, обеспечивая глубинную защиту.
  4. Для учетных данных службы используйте управляемые удостоверения или хранилища ключей. Службы, работающие на Azure, должны использовать управляемые удостоверения. Локальные службы должны получать секреты из безопасного хранилища во время выполнения, а не хранить их в файлах конфигурации.

Принципы обработки паролей

Когда пароли должны обрабатываться в коде:

  • Как можно скорее соберите пароли и удалите их как можно раньше. Сведите к минимуму время, в течение которого секретные данные хранятся в памяти.
  • Никогда не регистрируют пароли или секреты. Убедитесь, что журналы диагностики, журналы событий и дампы сбоев не содержат учетных данных.
  • Никогда не передавать пароли в виде обычного текста. Всегда используйте TLS/HTTPS или эквивалентный зашифрованный канал.
  • Вводите запросы безопасно. Используйте CredUIPromptForWindowsCredentials для сбора учетных данных через стандартное диалоговое окно учетных данных Windows, которое обеспечивает безопасную изоляцию рабочего стола.

Дополнительные сведения об угрозах и устранении рисков: