Шифрование SQLite базы данных в Qt

в 17:15, , рубрики: aes, qt, sqlite, sqlite3, информационная безопасность, шифрование

Для шифрования в 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

Источник

Поделиться

* - обязательные к заполнению поля