Автор статьи: Рустем Галиев

IBM Senior DevOps Engineer & Integration Architect. Официальный DevOps ментор и коуч в IBM

Привет Хабр!

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

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

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

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

Когда мы рассматриваем конфиденциальность в контексте проектирования безопасности, мы имеем в виду различные формы криптографии. Криптография бывает двух видов: скрытая и явная (Covetr&Overt).

Скрытая криптография обеспечивает конфиденциальность путем сокрытия чувствительных данных внутри других, не чувствительных данных. Только стороны, осведомленные о существовании секретных данных и способах их расшифровки, могут прочитать или получить к ним доступ. В этом случае не чувствительные данные выступают в роли ширмы.

Стеганография в контексте скрытой криптографии (Covert cryptography) — это метод, который позволяет скрывать наличие чувствительных данных внутри других, не чувствительных данных. Этот метод используется для маскировки факта передачи или хранения конфиденциальной информации, делая её незаметной для посторонних. Стеганография может применяться, например, для скрытия текста внутри изображения, аудиофайла или видео. Таким образом, только те, кто знает о существовании скрытых данных и обладает необходимыми знаниями для их извлечения, смогут получить к ним доступ.

Водяные знаки (Watermarking) в контексте скрытой криптографии (Covert cryptography) — это метод внедрения информации в цифровой носитель (например, изображение, аудиофайл или видео) таким образом, чтобы она была незаметна для обычного пользователя, но могла быть обнаружена и извлечена с использованием специальных методов. Водяные знаки используются для защиты авторских прав, проверки подлинности, отслеживания распространения цифрового контента и предотвращения несанкционированного использования.

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

Явная криптография обеспечивает конфиденциальность, делая сообщение либо нечитаемым, например, с помощью хеширования, либо неразгаданным, например, с помощью шифрования. Только те стороны, которые могут проверить или расшифровать защищенное сообщение, могут получить к нему доступ.

Хеширование (Hashing) в контексте явной криптографии (Overt cryptography) — это процесс преобразования входных данных произвольной длины в фиксированную строку фиксированной длины. Хеш-функции используются для создания уникального "отпечатка" (хеша) исходных данных. Этот процесс является односторонним, что означает, что по полученному хешу нельзя восстановить исходные данные.

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

Шифрование (Encryption) в контексте явной криптографии (Overt cryptography) - это процесс преобразования исходных данных в непонятную форму (шифр) с использованием математических алгоритмов и ключа. Только те, кто имеет правильный ключ или может выполнить расшифровку, могут восстановить исходные данные из зашифрованного текста. Шифрование обеспечивает конфиденциальность данных путем предотвращения несанкционированного доступа к чувствительной информации.

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

Теперь о шифровании

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

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

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

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

Реализация симметричного шифрования требует управления ключами шифрования.

Этот процесс управления ключами демонстрирует 6 различных этапов в жизненном цикле симметричного ключа, которые включают генерацию ключа, обмен ключами, хранение ключей, ротацию ключей, архивирование ключей и, наконец, уничтожение ключей.

Будьте внимательны, выбор алгоритма для симметричного шифрования может повлиять на скорость вашей системы.

Ниже приведены таблицы, отображающие время в микросекундах (на каждый раунд, используя 100 000 раундов), необходимое для шифрования и расшифрования симметричных ключей.

Асимметричные системы более элегантны, но могут быть более сложными для понимания из-за специального способа разделения ключей. У каждого человека есть набор из двух ключей: Public и private.

Открытый ключ (Public) предназначен для общего использования. Люди используют его для шифрования данных для вас. Другими словами, если вы хотите, чтобы кто-то отправил вам секрет, это ключ, о котором вам не нужно беспокоиться в отношении его раскрытия им. Вы даже можете разместить его на своем веб-сайте или профиле, если хотите, так как его также можно использовать для вашей проверки.

Закрытый ключ (Private) — это ваш традиционный секретный ключ. Это тот ключ, который вы никогда не хотите раскрывать или терять. Он также будет использоваться для расшифровки всего, что зашифровано с вашим общим открытым ключом. Потеряв его, вы потеряете возможность расшифровки! Вы также можете использовать ключ для подписи данных и доказательства того, что это были вы, кто их подписал.

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


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

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

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

Symmetric vs Asymmetric

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

Асимметричные системы имеют открытый ключ, который распространяется всем, и закрытый ключ, который остается секретным. Люди отправляют секреты, шифруя их вашим открытым ключом, и только у вас есть закрытый ключ для расшифровки этих данных.

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

Невозможность отказа от ответственности. Как можно быть уверенным, что письмо в нашем почтовом ящике действительно было отправлено тем, кто утверждает, что отправил его? Асимметричные системы обеспечивают это, позволяя отправителю подписывать или маркировать сообщение с помощью своего закрытого ключа, который затем может быть проверен с использованием открытого ключа отправителя. Симметричные системы не обладают этой способностью.

Эти характеристики могут влиять на решение о выборе системы для шифрования при проектировании.

На этом мы на сегодня закончим и продолжим в следующей части. Данная статья подготовлена в преддверии старта курса Software Architect. Подробнее о курсе по ссылке.

Комментарии (1)


  1. SUNsung
    27.05.2024 06:17
    +6

    Статья хорошая, но оставила послевкусие: "как прочитать лекцию о том, про что я ничего не знаю и не подать вида".

    Как стенография или водяные знаки вообще относятся к криптографии? Это можно использовать в криптографии, для хранения контрольных сумм разного толка и прочих данных необходимых для подтверждения целостности, но назвать это "скрытой криптографией"....

    Алгоритмы шифрования - ожидалось какого-то базового обзора обо всем и не о чем, с затрагиванием конкретных случаев и пояснением для чего они лучше. А на деле просто сказали "есть симметричное, есть ассиметричное, вот какие у него особенности".
    Ладно если это "обзорная" статья, но зачем тогда приводить пример с таблицами, отображающими время в микросекундах для шифрования и расшифрования (только симметричных алгоритмов)? Почему не привели такой же пример для асимметричных? Почему вообще в таблице DES, но нет AES?
    И это я не затрагиваю такие тонкие материи как стойкость, размер пакетов (для некоторых алгоритмов это критично и может затрагивать поставленную цель) или, боже упаси, быстрые проверки целостности без необходимости дешифровать весь пакет или комплексные подходы шифрованию для разных уровней данных.

    В целом тема очень интересная и имеющая множество подводных. И даже на базовом уровне, затрагивая верха, что бы привлечь к своему курсу можно написать много разного.
    Но текущая подача наоборот отталкивает - если такое пишут в "обзорной статье", то что же тогда там "рассказывают" в специально подготовленном курсе?