Безопасное проектирование программного обеспечения. Конфиденциальность и Шифрование

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

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

Привет Хабр!

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

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

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

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

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

3f5aa4068b96876a0f7b74a16faad3f0.png

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

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

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

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

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

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

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

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

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

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

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

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

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

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

81c9050d5964400a53f8dc5837f46982.png

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

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

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

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

263db23092daa5055a5bd81045c0a0bf.png

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

019ff02db6094db7b66b0179e8804fdf.png

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

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

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

94cb2135d60bd05cde887956bdddff5f.png


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

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

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

Symmetric vs Asymmetric

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

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

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

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

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

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

© Habrahabr.ru