0Pricing
Cryptology Academy · Урок

Основные схемы неправильного использования криптографии

Изучите наиболее распространенные ошибки разработчиков: режим ECB, слабая инициализация PRNG и самостоятельная реализация криптографии.

«Основные схемы неправильного использования криптографии» — бесплатный урок Cryptology Academy на CoddyKit. Это урок 4 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Cryptology Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Cryptology Academy содержит 4 уроков всего.

Режим ECB раскрывает шаблоны блоков

Режим электронной кодовой книги (ECB) шифрует каждый блок независимо, используя один и тот же ключ. Одинаковые блоки открытого текста дают одинаковые блоки шифротекста. Классическая демонстрация — «пингвин ECB»: шифрование растрового изображения в режиме ECB сохраняет структуру изображения на уровне блоков, поэтому очертания пингвина остаются отчетливо видимыми в шифротексте. Режим ECB не обеспечивает семантическую безопасность и никогда не должен использоваться для практического шифрования.

Самостоятельная реализация криптографии

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

MD5 и SHA-1 в целях безопасности

Коллизии MD5 можно строить с 2004 года; создание двух файлов с одинаковым хешем MD5 не представляет вычислительной сложности. Практическая атака Google SHAttered в 2017 году продемонстрировала коллизии SHA-1, создав два файла PDF с одинаковым хешем SHA-1. Ни MD5, ни SHA-1 не следует использовать в целях безопасности: для цифровых подписей, контроля целостности содержимого, хранения паролей или HMAC. Для современных систем используйте SHA-256, SHA-3 или BLAKE2.

Предсказуемая инициализация PRNG

Использование time() или других предсказуемых значений для инициализации генератора псевдослучайных чисел представляет критическую уязвимость, если выходные данные PRNG применяются в целях безопасности. Злоумышленник, который приблизительно знает, когда был создан ключ, может перебрать пространство начальных значений (все возможные отметки времени в небольшом диапазоне) и восстановить ключ. Классический пример: ранние версии Netscape инициализировали генерацию ключей SSL с помощью времени и идентификатора процесса — оба значения злоумышленник на той же машине мог наблюдать.

Выбор слабого PRNG

rand() в C, java.util.Random и модуль random в Python используют детерминированные линейные конгруэнтные генераторы или вихрь Мерсенна, предназначенные для статистического качества при моделировании, а не для безопасности. Злоумышленник, наблюдающий достаточное количество выходных данных таких генераторов, может восстановить их внутреннее состояние и предсказать все будущие выходные данные. В целях безопасности используйте генераторы CSPRNG, предоставляемые OS: secrets.token_bytes() в Python, crypto.randomBytes() в Node.js или /dev/urandom в Linux.

Шифрование без аутентификации

Шифрование без аутентификации обеспечивает только конфиденциальность, но не целостность. Злоумышленник, который не может прочитать открытый текст, все же может изменить шифротекст, потенциально вызвав предсказуемые изменения открытого текста (особенно в режиме CTR или CBC). Такая податливость позволяет проводить атаки: перехватив зашифрованную банковскую операцию, злоумышленник может изменить отдельные биты и тем самым поменять сумму перевода или счет получателя, не зная открытого текста. Всегда используйте аутентифицированное шифрование (AEAD).

Жёстко заданные ключи и векторы инициализации

Жёсткое задание ключей шифрования или векторов инициализации в исходном коде представляет критическую уязвимость. Исходный код часто сохраняется в репозиториях систем управления версиями, иногда публичных. Даже в закрытых репозиториях любой, у кого есть доступ к коду, получает доступ к ключу. Жёстко заданные ключи означают, что все экземпляры используют один и тот же ключ, а смена ключа требует повторного развертывания. Ключи необходимо хранить в переменных окружения, системах управления секретами (HashiCorp Vault, AWS Secrets Manager) или аппаратных модулях безопасности.

Повторное использование векторов инициализации

Использование одного и того же вектора инициализации для нескольких операций шифрования с одним ключом создает серьезные уязвимости. В режиме CTR повторное использование IV создает один и тот же поток ключей, позволяя восстановить открытый текст с помощью XOR. В режиме CBC повторное использование IV позволяет злоумышленнику определить, когда два сообщения начинаются с одинаковых блоков открытого текста. В режиме GCM повторное использование одноразового номера (IV) имеет катастрофические последствия (см. урок о повторном использовании одноразовых номеров). Для каждой операции шифрования создавайте новый случайный IV; добавляйте его в начало шифротекста для хранения вместе с контекстом расшифрования.

Хеширование паролей с помощью быстрых хеш-функций

Хранение паролей в виде хешей, вычисленных с помощью MD5, SHA-256 или любой другой быстрой криптографической хеш-функции, недостаточно безопасно. Современные графические процессоры могут вычислять миллиарды хешей SHA-256 в секунду, поэтому автономный перебор украденных баз данных хешей становится чрезвычайно быстрым. Для хеширования паролей нужны специально созданные медленные функции, требующие много памяти: bcrypt, scrypt или Argon2id. Они разработаны так, чтобы сделать перебор дорогостоящим даже на специализированном оборудовании и сохранить автономные атаки практически невыполнимыми.

Игнорирование проверки сертификатов

Отключение проверки сертификатов SSL/TLS (задание ssl.CERT_NONE в Python, передача -k утилите curl, установка trustAllCerts=true в Android) устраняет защиту от атак посредника. Злоумышленник может предъявить любой сертификат и перехватить все сообщения. Такая практика появляется при разработке для обхода ошибок самоподписанных сертификатов, но часто сохраняется и в рабочей среде. Всегда выполняйте надлежащую проверку сертификатов и правильно устраняйте исходные проблемы с сертификатами.

Отсутствие проверки возвращаемых значений

Криптографические функции сообщают о сбоях через возвращаемые значения или исключения. Их игнорирование позволяет продолжить выполнение с некорректным состоянием: расшифрованием, давшим бессмысленные данные, неудачной проверкой или завершившейся ошибкой генерацией ключа. В API на основе C, таких как OpenSSL, игнорирование возвращаемых значений особенно опасно, поскольку программа может продолжить работу с неинициализированной памятью. Всегда проверяйте каждое возвращаемое значение криптографических функций и безопасно обрабатывайте сбои.

Уязвимость режима ECB

Почему режим ECB (электронной кодовой книги) считается небезопасным для шифрования данных?

Итоги неправильного использования криптографии

Основные ошибки, которых следует избегать: никогда не используйте режим ECB (он раскрывает шаблоны блоков), не реализуйте криптографические примитивы самостоятельно, не используйте MD5 и SHA-1 в целях безопасности, инициализируйте PRNG с помощью CSPRNG, а не time(), используйте CSPRNG для всей чувствительной к безопасности случайности, всегда аутентифицируйте зашифрованные данные (AEAD), никогда не задавайте ключи или IV жестко, создавайте новый IV для каждой операции шифрования, используйте Argon2id для паролей вместо быстрых хеш-функций, всегда проверяйте сертификаты TLS и проверяйте каждое возвращаемое значение криптографических функций.

Часто задаваемые вопросы

Урок «Основные схемы неправильного использования криптографии» бесплатный?

Да — полный текст урока «Основные схемы неправильного использования криптографии» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Cryptology Academy, подпишись на CoddyKit PRO. Курс Cryptology Academy содержит 4 уроков всего.

Чему я научусь в уроке «Основные схемы неправильного использования криптографии»?

Изучите наиболее распространенные ошибки разработчиков: режим ECB, слабая инициализация PRNG и самостоятельная реализация криптографии. Ты практикуешь Cryptology Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать Cryptology Academy?

Предыдущий опыт не требуется. Cryptology Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 4 из 4.

Сколько времени занимает урок «Основные схемы неправильного использования криптографии»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке Cryptology Academy?

Да. Каждый урок Cryptology Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Атаки Padding Oracle подробно
  2. Атаки повторной передачи и уязвимости повторного использования nonce
  3. Атаки по времени в коде на уровне приложения
  4. Основные схемы неправильного использования криптографии
← Назад к Cryptology Academy