Шифрование SQLite базы данных в Qt
Для шифрования в SQLite были найдены следующие возможные решения: SEE — официальная реализация. wxSQLite — c++ wxWidgets обертка для шифрования SQLite. SQLCipher — использует в реализации openSSL. SQLiteCrypt — модифицированная реализация API. botansqlite3 — шифрующий кодек для SQLite3 использующий библиотеку botan. SQLiteCrypto — java API для Android, использует AES-256 и SHA-256. QtCipherSqlitePlugin — SQL плагин для Qt с поддержкой шифрования. Из рассмотренных решений SEE, SQLiteCrypt and SQLiteCrypto требуют приобретения лицензии. SQLCipher доступен в версии Community Edition, но требует libcrypto.Наиболее интересным решением из представленного списка, на мой взгляд, является QtCipherSqlitePlugin.Плагин шифрует «на лету» и полностью интегрирован в API Qt.Плагин базируется на исходниках SQLite, а также wxSQLite3 из wxWidgets и выпущен под лицензией LGPL 2.1.В качестве алгоритма шифрования используется Advanced Encryption Standard (AES).
Сборка и установка плагина1. Скачиваем исходники QtCipherSqlitePlugin
git clone https://github.com/devbean/QtCipherSqlitePlugin.git2. Скачиваем исходники Qt необходимой версии (в примере — 4.8.6)
wget https://download.qt.io/archive/qt/4.8/4.8.6/qt-everywhere-opensource-src-4.8.6.tar.gz3. Распаковываем полученный архив
tar zxvf qt-everywhere-opensource-src-4.8.6.tar.gz4. Открываем проект в QtCreator
QtCipherSqlitePlugin\sqlitecipher\sqlitecipher.pro5. Указываем директории исходников Qt
В файле QtCipherSqlitePlugin\sqlitecipher\qt_p.pri в строчках
# Qt4! greaterThan (QT_MAJOR_VERSION, 4): INCLUDEPATH +=
Задать соответствующие пути к исходникам Qt. В моем случае для Qt4 получилась строка /home/developer/Sources/qt-everywhere-opensource-src-4.8.6/src/sql/kernel
6. Собираем проект 7. Копируем библиотеку плагина в директорию плагинов Qt В моем случае в директорию /usr/lib/x86_64-linux-gnu/qt4/plugins/sqldriversИспользование плагина 1. Проверяем работоспособность Запустив приложение из проекта QtCipherSqlitePlugin/test/test.pro убеждаемся, что драйвер базы данных SQLITECIPHER появился в списке доступных драйверов. («QSQLITE», «SQLITECIPHER»)1: «AAA»2: «BBB»3: «CCC»3: «DDD»4: «EEE»5: «FFF»6: «GGG»
2. Создаем шифрованную БД Удаляем файл test_c.db, созданный в ходе выполнения приложения test.В коде main.cpp проекта test.pro перед подключением к БД устанавливаем пароль.dbconn.setPassword («password»); Запускаем приложение, будет создана тестовая БД. Закрываем его, меняем пароль, повторно запускаем, видим, что доступа с неверным паролем к БД нет.Нерешенный вопрос Осталось непонятным, как поменять пароль для уже созданной и зашифрованной по этому паролю БД.