Криптографическая архитектура Qt
Руководствуясь похожей по названию Криптографической архитектурой Java, QCA стремится предоставить простой и кроссплатформенный криптографический API, использующий типы данных и соглашения Qt. QCA отделяет API от реализации, используя плагины, называемые криптопровайдерами. Преимущество этой модели состоит в том, чтобы позволить приложениям избегать сопряжения или явной зависимости от какой-либо конкретной криптографической библиотеки. Эта функциональность позволяет легко изменять или обновлять реализации криптопровайдера без необходимости перекомпилировать приложение!
QCA должен работать везде, где работает Qt, включая Windows/Unix/MacOSX. Эта версия QCA предназначена для Qt4 или Qt5 и не требует кода для совместимости с Qt3.
Функциональность
Эта библиотека предоставляет простой API для следующей функциональности:
- Безопасные массивы байтов (QCA::SecureArray).
- Целые числа произвольной точности (QCA::BigInteger).
- Генерация случайных чисел (QCA::Random).
- Сертификаты X509 (QCA::Certificate и QCA::CertificateCollection).
- Списки отозванных сертификатов X509 (QCA::CRL).
- Встроенная поддержка корневого хранилища сертификатов операционной системы (QCA::systemStore).
- Подсистема управления смарт-картами (QCA::KeyStore).
- Простая, но гибкая система ведения журнала (QCA::Logger).
- RSA (QCA::RSAPrivateKey и QCA::RSAPublicKey).
- ECDH и ECDSA (QCA::ECPrivateKey и QCA::ECPublicKey).
- Хеширование (QCA::Hash) с помощью: - SHA-1;
- MD4;
- MD5;
- RIPEMD160;
- SHA-224;
- SHA-256;
- SHA-384;
- SHA-512;
- Whirlpool.
- Шифрование
(QCA::Cipher) с
использованием:
- BlowFish;
- Тройной DES;
- DES;
- AES (128, 192 и 256 бит);
- CAST5 (также известный как CAST-128).
- Код аутентификации сообщения
(QCA::MessageAuthenticationCode)
с использованием:
- HMAC с SHA-1;
- HMAC с MD5;
- HMAC с RIPEMD160;
- HMAC с SHA-224;
- HMAC с SHA-256;
- HMAC с SHA-384;
- HMAC с SHA-512.
- Кодирование и декодирование шестнадцатеричных (QCA::Hex) и Base64 (QCA::Base64) строк.
Функциональность предоставляется через плагины. Этот подход полезен для того, чтобы избежать зависимости от конкретной криптографической библиотеки и упростить обновление, поскольку нет необходимости перекомпилировать приложение при добавлении или обновлении криптографического плагина. Кроме того, благодаря включению криптографических функций в плагины приложение избавляется от юридических проблем, таких как регулирование экспорта.
И, конечно, предоставляется очень простой криптографический API для Qt, с помощью которого можно выполнять подобные действия:
QString hash = QCA::Hash("sha1").hashToString(blockOfData);
Использование QCA
Приложение просто включает <QtCrypto>
и ссылки на libqca
, которая предоставляет
«оболочку API» и загрузчик плагинов. Криптографическая функциональность определяется во время
выполнения, а подключаемые модули загружаются из подкаталога «crypto» путей к библиотеке Qt.
Доступны дополнительные примеры.
Введение
Использование QCA во многом похоже на использование Qt, и при опыте работы с Qt работа с QCA должна казаться «естественной». Однако для создания надёжных приложений необходимо знать несколько особенностей:
- QCA необходимо инициализировать перед использованием любого класса, который требует поддержки плагинов или использует безопасную память. Это большая часть QCA, поэтому следует обязательно предполагать, что нужно выполнить инициализацию. Самый простой способ сделать это — создать экземпляр объекта QCA::Initializer и убедиться, что он не удалён (или не может выйти за пределы области видимости), пока не закончится использование QCA.
- Большинство функциональности/алгоритмов предоставляется плагинами/криптопровайдерами. Необходимо убедиться, что требуемая функция действительно доступна (используя QCA::isSupported()), прежде чем пытаться её создать. Если приложение попытается создать класс, а поддержка подходящего криптопровайдера недоступна, оно вернётся к нулевому объекту, а когда попытается использовать один из методов — получит ошибку сегментации. Кроме того, для функциональности, которая использует имена алгоритмов (например, QCA::Hash, который принимает на вход имя алгоритма хеширования, например «md5» или «sha256»), имя ищется во время выполнения, поэтому при опечатке (например, «md56») всё будет компилироваться правильно, но во время выполнения произойдёт ошибка сегментации.
Идеи насчёт безопасности
QCA пытается быть гибким в том, что он поддерживает. Это не означает, что каждая возможная комбинация функций имеет смысл.
Выбирая конкретную криптографическую функцию, необходимо понимать то, каким угрозам может подвергнуться приложение и как с этой угрозой можно эффективно справляться. Кроме того, следует проанализировать, можно ли избежать добавления криптографической функциональности непосредственно в приложение (например, для безопасной коммуникации можно туннелировать приложение через SSH).
Архитектура
Архитектура QCA демонстрируется ниже:
Архитектура QCA
Авторам приложений обычно нужно использовать только User API. API криптопровайдера доступен для авторов плагинов, но также может использоваться авторами приложений для предоставления очень специфических возможностей.
Для получения дополнительной информации о дизайне QCA можно обратиться к описанию архитектуры.