ШИФРОВАНИЕ БАЗЫ ДАННЫХ SQLITE

LiteSync поставляется с шифрованием баз данных SQLite, а также связи между узлами.

Доступны шифры ChaCha, которые быстрее, чем AES на небольших устройствах, и XRC4, расширенная версия RC4, даже быстрее, чем ChaCha.

Чтобы открыть зашифрованную базу данных, мы используем URI-параметры cipher и key или hexkey. Например:

"file:/path/to/file.db?cipher=...&key=..."

Или

"file:/path/to/file.db?cipher=...&hexkey=..."


ШИФР

Шифрованный параметр может быть установлен в одно из следующих значений:

xrc4 - самый быстрый
chacha8 - быстрый
chacha12 - средний
chacha20 - самый сильный



КЛЮЧ

При использовании XRC4 ключ может быть до 256 байтов. Например:

"file:data.db?cipher=xrc4&key=testing"

При использованииChaCha ключ должен быть длиной 32 байта. Например:

"file:data.db?cipher=chacha20&key=ThisIsAReallyLongKeyWith32Bytess"

Ключ также может быть в шестнадцатеричном формате, используя параметр hexkey:

"file:data.db?cipher=...&hexkey=11223344556677889900AABBCCDDEEFF..."


СОЗДАНИЕ ЗАШИФРОВАННОЙ БАЗЫ ДАННЫХ

Откройте базу данных с URI, как указано выше, а затем создайте таблицы и заполните их.



ПРЕОБРАЗОВАНИЕ СУЩЕСТВУЮЩЕЙ БАЗЫ ДАННЫХ

В настоящее время невозможно выполнить прямое преобразование существующей базы данных. Мы должны создать зашифрованную базу данных, используя оболочку SQLite, а затем скопировать в нее данные из простой базы данных.

Это можно сделать всего за 1 шаг:

sqlite3 plain.db .dump | sqlite3 "file:encrypted.db?cipher=...&key=..."

Или за 2 шага, если вы хотите проверить сгенерированные команды SQL:

sqlite3 plain.db .dump > out.sql

sqlite3 "file:encrypted.db?cipher=...&key=..." < out.sql

Если вы хотите использовать размер страницы, отличный от размера по умолчанию, откройте сгенерированный файл out.sql file и добавьте строку с Прагмой вверху:

PRAGMA page_size=...;

Внимание: этот зашифрованный файл базы данных следует использовать только на основном узле. Вторичные узлы загрузят этот файл с основного узла, когда соединение будет установлено.



ЗАГОЛОВОК БАЗЫ ДАННЫХ

Первые 100 байтов базы данных SQLite образуют заголовок. Большая часть это фиксированные данные.

В случае шифрования, если у нас есть известные простые данные, это поможет злоумышленнику попытаться обнаружить ключ шифрования.

По этой причине заголовок базы данных не шифруется по умолчанию, но у вас есть всего 3 варианта:


1. Не шифруйте заголовок БД

Это работает по умолчанию.


2. Не шифруйте заголовок базы данных и используйте пользовательскую строку заголовка

Первые 16 байтов заголовка формируют строку заголовка. Строка заголовка по умолчанию - «Формат SQLite 3» (с нулевым терминатором).

Если по какой-то причине вы не хотите, чтобы было ясно, что файл является базой данных SQLite, вы можете изменить эту строку.

Чтобы включить использование настраиваемого заголовка, скомпилируйте LiteSync с:

CODEC_USE_CUSTOM_HEADER

CODEC_CUSTOM_HEADER="ExampleNewHeader"

Пользовательская строка заголовка должна иметь длину 15 или 16 байтов. Если используется 15 байтов, последний будет нулевым терминатором.


3. Зашифруйте заголовок БД, но не шифруйте байты 16-23 из него.

Эти байты необходимы для SQLite, чтобы быть незашифрованными.

Для шифрования заголовка базы данных скомпилируйте LiteSync с помощью:

CODEC_ENCRYPT_DB_HEADER



ВНУТРЕННИЙ ДИЗАЙН

Каждая страница шифруется и дешифруется по требованию, и каждая страница имеет свой собственный вектор инициализации (nonce). Каждый раз, когда страница сохраняется, используется новый IV, и тогда все зашифрованные данные страницы будут отличаться от предыдущих.

WAL-страницы также зашифрованы.

При обмене данными между узлами используется один и тот же шифр и ключ, выбранные для базы данных. Каждое сообщение использует другой вектор инициализации, поэтому одни и те же простые данные отправляются в виде другого криптопотока.