Шифрование в распределенной системе обмена файлами
Ouisync предлагает пользователям безопасный способ обмена и синхронизации данных между устройствами. Из-за распределенной (одноранговой) природы Ouisync, в которой возможны одновременные изменения файлов и каталогов, структура каталогов Ouisync довольно сложна. Если два или более пользователей одновременно изменяют файл в каталоге, архитектура Ouisync гарантирует, что информация не будет потеряна. Более того, Ouisync защищает содержимое (файлы и хранилища) и структуру ваших файловых систем, применяя сквозное шифрование.
Когда вы делитесь хранилищем в определенном режиме (редактирование, чтение или слепой режим) Ouisync генерирует ключи (так называемые “токены”), которыми вы можете поделиться со своими коллегами в виде ссылки или QR-кода. Когда вы импортируете хранилище с помощью такого токена, ваше устройство получает возможность расшифровать каталоги и файлы в этом хранилище (за исключением режима Blind).
Данные шифруются как в состоянии покоя (при простом хранении), так и при передаче (во время передачи данных). Важно отметить, что Ouisync может синхронизироваться без расшифровки, и ни одному устройству не нужно знать ключ расшифровки для выполнения синхронизации. Имена файлов, содержимое файлов и даже размеры файлов и структура каталогов скрыты от узлов, не обладающих ключом шифрования. Таким образом, партнёры, имеющие только слепой доступ к Вашим хранилищам, не смогут видеть ни содержимое Ваших хранилищ, ни их структуру.
Какие алгоритмы шифрования используются?
- При передаче Ouisync использует фреймворк Noise protocol, в частности шаблон NNpsk0. Это позволяет Ouisync генерировать эфемерные ключи с предварительно раскрытым (pre-shared) ключом. Предварительно раскрытый (pre-shared) ключ в Ouisync - это идентификатор (ID) хранилища. Noise поддерживает взаимную и дополнительную аутентификацию, скрытие идентификационных данных, прямую секретность, нулевое шифрование в оба конца и другие расширенные криптографические функции.
- В состоянии покоя Oyisync шифрует данные с помощью ChaCha20. В этом случае «Ключ чтения» используется в качестве симметричного ключа шифрования/дешифрования. Ключи аутентифицируются с использованием подписей Ed25519, при этом «ключ записи» является закрытым ключом.
- Для хэширования Ouisync использует хэш-функцию BLAKE3, которая считается стабильно более быстрой на разных платформах и размерах входных данных.
Что такое Блок?
Каждый файл и каждый каталог, хранящиеся в Ouisync, разделены на относительно небольшие (например, 32 КБ) блоки постоянного размера. Каждый блок имеет идентификатор блока (“Block ID”, генерируемый генератором случайных чисел), который помогает Ouisync идентифицировать эти блоки. Все блоки хранятся вместе с файлом под названием “locator”. Локатор - это своего рода “карта”, которая указывает, где расположен каждый блок относительно других блоков. Однако, чтобы не раскрывать эту структуру агентам, не обладающим секретным ключом, локаторы не хранятся обычным текстом, а закодированы.
_ Представьте, что Вы устраиваете большую свадебную вечеринку, на которую приглашаете множество гостей. Те, кто уже организовывал подобные мероприятия, знают, как трудно распределить надлежащие места для всех гостей, учитывая их отношения, интересы и так далее. Кстати, Вам также необходимо сообщить эту информацию официантам, которые должны быть внимательны и помнить, у кого из гостей аллергия или диетические предпочтения. А поскольку ваши гости - VIP-персоны, Вы не хотите раскрывать официантам их настоящие имена, поэтому придумываете случайные псевдонимы и записываете их на этих красивых карточках с распределением мест. Итак, если мы будем придерживаться этой метафоры, идентификатором блока будет псевдоним, написанный на карточке рядом с местом Вашего гостя, а “локатором” будет карта всех столов с правильно распределенными местами._
Что такое “blob”?
Линейный набор блоков будет называться blob. Blob’ы (также известные как “большие двоичные объекты”) могут представлять файлы и каталоги. Файловый blob является более простым: он состоит из заголовка, содержащего размер файла, разрешения и метки времени. Blob каталога представляет собой список имен файлов, присутствующих в каталоге, а также локаторы, указывающие на отдельные blob’ы файлов.
Как происходит синхронизация?
Когда Вы предоставляете общий доступ к хранилищу своему партнеру, это создает “точную копию” (“реплику”) Вашего хранилища. Структура хранилища хранится в так называемых файлах “индексов” - когда устройства партнёров подключаются, они сначала обмениваются этими индексами. Если что-то было изменено в одной из реплик, Ouisync загрузит недостающие блоки. Ouisync всегда сначала загружает каталоги и только после - сами файлы. Это помогает Ouisync корректно восстанавливать Ваши данные из блоков, не искажая их. Кроме того, это делается без утечки информации пользователям, у которых нет доступа “на чтение” к Вашим хранилищам.
Вам не нужно беспокоиться о конфликтах между различными репликами: в бэкенде синхронизация выполняется таким образом, чтобы избежать конфликтов и расхождений. То, что Вы видите, когда открываете Ouisync, - это то, что мы называем “снимком”: представление всего дерева каталогов в определенный момент времени для Вас. Каждое изменение файловой системы (на Вашем устройстве или на устройствах Ваших коллег) приводит к созданию нового “снимка”.