ШИФРОВАНИЕ БАЗЫ ДАННЫХ 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-страницы также зашифрованы.
При обмене данными между узлами используется один и тот же шифр и ключ, выбранные для базы данных. Каждое сообщение использует другой вектор инициализации, поэтому одни и те же простые данные отправляются в виде другого криптопотока.