Для шифрования в 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.git
2. Скачиваем исходники Qt необходимой версии (в примере — 4.8.6)
wget https://download.qt.io/archive/qt/4.8/4.8.6/qt-everywhere-opensource-src-4.8.6.tar.gz
3. Распаковываем полученный архив
tar zxvf qt-everywhere-opensource-src-4.8.6.tar.gz
4. Открываем проект в QtCreator
QtCipherSqlitePluginsqliteciphersqlitecipher.pro
5. Указываем директории исходников Qt
В файле QtCipherSqlitePluginsqlitecipherqt_p.pri в строчках
# Qt4
!greaterThan(QT_MAJOR_VERSION, 4): INCLUDEPATH += <Qt4_Path>/src/sql/kernel
# Qt5
greaterThan(QT_MAJOR_VERSION, 4): INCLUDEPATH += <Qt5_Path>/Src/qtbase/src/sql/kernel
Задать соответствующие пути к исходникам 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");
Запускаем приложение, будет создана тестовая БД. Закрываем его, меняем пароль, повторно запускаем, видим, что доступа с неверным паролем к БД нет.
Нерешенный вопрос
Осталось непонятным, как поменять пароль для уже созданной и зашифрованной по этому паролю БД.
Автор: snasoft