Шифрування в розподіленій системі обміну файлами

Ouisync пропонує користувачам безпечний спосіб обміну та синхронізації даних між пристроями. Завдяки розподіленій (одноранговій) природі Ouisync, де можливі одночасні зміни файлів і каталогів, структура каталогів Ouisync є досить складною. Коли два або більше користувачів одночасно змінюють файл у каталозі, архітектура Ouisync гарантує, що інформація не буде втрачена. Більше того, Ouisync також захищає вміст (файли і сховища) і структуру ваших файлових систем, реалізуючи наскрізне шифрування.

При наданні доступу до сховища в певному режимі (запис, читання або сліпий) Ouisync генерує ключі (так звані “токени”), якими ви можете поділитися з іншими користувачами у вигляді посилань або QR-кодів. Імпорт сховища за допомогою токена дає вашому пристрою можливість розшифрувати його каталоги і файли (крім режиму “Сліпий”).

Дані шифруються як у стані спокою (коли вони просто зберігаються), так й під час передачі (під час передачі даних). Важливо, що Ouisync може синхронізувати без розшифрування, і жодному пристрою не потрібно знати ключ розшифрування, щоб виконати синхронізацію. Імена файлів, вміст файлів і навіть розміри файлів та структура каталогів приховані від пристроїв, які не мають ключа шифрування. Таким чином, колеги, які мають лише сліпий доступ до ваших сховищ, не можуть бачити ані вміст ваших сховищ, ані їхню структуру.

Які алгоритми шифрування використовуються?

Що таке блок?

Кожен файл і кожен каталог, що зберігається у Ouisync, поділено на відносно невеликі (наприклад, 32 КБ) блоки постійного розміру. Кожен блок має ідентифікатор блоку (згенерований за допомогою генератора випадкових чисел), який допомагає Ouisync ідентифікувати ці блоки. Всі блоки зберігаються разом з файлом, який називається “локатор”. Локатор - це своєрідна “мапа”, яка показує, де кожен блок розташований відносно інших блоків. Однак, щоб не розкривати цю структуру агентам, які не володіють секретним ключем, локатори не зберігаються безпосередньо, а кодуються.

Уявіть, що ви організовуєте велику весільну вечірку, на яку запрошуєте багато гостей. Ті, хто вже організовував подібні заходи, знають, як важко розсадити всіх гостей, враховуючи їхні стосунки, інтереси тощо. До речі, цю інформацію потрібно також донести до офіціантів, які повинні бути уважними і пам’ятати, хто з гостей має алергію чи дієтичні вподобання. А оскільки ваші гості - VIP, ви не хочете називати офіціантам їхні справжні імена, тому вигадуєте випадкові псевдоніми і пишете їх на цих красивих картках розподілу місць. Отже, якщо дотримуватися цієї метафори, ідентифікатор блоку - це псевдонім, написаний на картці поруч із місцем вашого гостя, а “локатор” - це карта всіх столиків з правильно розподіленими місцями.

image

Що таке блоб (згусток)?

Лінійний набір блоків називається блобом (згусток). Блоби можуть представляти файли і каталоги. Файловий блок є найпростішим: він складається із заголовка, що містить розмір файлу, дозволи та мітку часу. Блоб-директорія являє собою список імен файлів, присутніх у директорії, а також локатори, що вказують на окремі файлові блоки.

Як проходить синхронізація?

Коли ви надаєте спільний доступ до сховища одноранговим пристроям, це створює “копію” вашого сховища. Структура сховища зберігається у так званих “індексних” файлах - коли однорангові пристрої підключаються, вони спочатку обмінюються цими індексами. Якщо щось було змінено в одній з реплік, Ouisync завантажить відсутні блоки. Ouisync завжди спочатку завантажує каталоги, а вже потім самі файли. Це допомагає Ouisync правильно відновити ваші дані з блоків, не зіпсувавши їх. Крім того, це робиться без витоку інформації користувачам, які не мають доступу “на читання” до ваших сховищ.

Вам не варто непокоїтися за конфлікти між різними копіями: у бекенді синхронізація виконується таким чином, щоб уникнути конфліктів і розбіжностей. Те, що ви бачите, коли відкриваєте Ouisync, - це те, що ми називаємо “знімком”: ваше уявлення про все дерево каталогів у певний момент часу. Кожна зміна файлової системи (на вашому пристрої або на пристроях ваших колег) призводить до створення нового “знімка”.