Шифрування SQLite бази даних в Qt

Для шифрування в SQLite були знайдені можливі наступні рішення:
  • SEE — офіційна реалізація.
  • wxSQLite — c++ wxWidgets обгортка для шифрування SQLite.
  • SQLCipher — використовує в реалізації openSSL.
  • SQLiteCrypt — модифікована реалізація API.
  • botansqlite3 — шифрувальний кодек для SQLite3 використовує бібліотеку ботан.
  • 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
QtCipherSqlitePlugin\sqlitecipher\sqlitecipher.pro

5. Вказуємо директорії исходников Qt
У файлі QtCipherSqlitePlugin\sqlitecipher\qt_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");

Запускаємо програму, буде створена тестова БД. Закриваємо його, змінюємо пароль, повторно запускаємо, бачимо, що доступу з невірним паролем до БД немає.

Невирішене питання

Залишилося незрозумілим, як змінити пароль для вже створеної і зашифрованою з цього пароля БД.

Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.