Хостинг нульового коду знань? [зачинено]


28

У світлі останніх розкриттів щодо широко розповсюдженого урядом моніторингу даних, що зберігаються в Інтернеті, постачальники послуг з нульовим знанням зараз дуже люблять.

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

Для прикладу: SpiderOak можна розглядати як версію Dropbox з нульовими знаннями.

Як програмісти, ми дуже покладаємось і довіряємо деякі наші найчутливіші дані - наш код - певному класу постачальників послуг в Інтернеті: провайдерам хостингу коду (наприклад, Bitbucket, Assembla тощо). Я, звичайно, тут говорю про приватні сховища - поняття нульових знань не має сенсу для публічних сховищ.

Мої запитання:

  1. Чи є якісь технологічні бар'єри для створення сервісу хостингу коду з нульовими знаннями? Наприклад, чи є щось про мережеві протоколи, використовувані популярними системами управління версіями, такими як SVN, Mercurial або Git, що ускладнить (або неможливо) реалізувати схему, коли дані, що передаються між клієнтом та сервером, шифруються ключ, який сервер не знає?

  2. Чи існують сьогодні якісь сервіси розміщення кодів з нульовим знанням?


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

2
@AndresF. Я можу тільки припустити, що SpiderOak означає, що у клієнта відбувається покоління диффайду, сервер зберігає зашифровані розмінні, а потім додаток diff-to-base знову виникає на клієнті, коли diff і base зашифровані. Я згоден, що їхня мова дуже незрозуміла.
апспіллери

2
@apsillers: Або ви могли навмисно вставити такий вміст у файл і використовувати його для ідентифікації самого файлу (наприклад, якщо хтось намагався використовувати шифрування для приховування піратства).
Брайан

4
Це не те, з чим я маю досвіду, але я можу уявити один із можливих технологічних бар'єрів, що мають сервіс хостингу коду з нульовими знаннями: чи не всім користувачам потрібно знати / використовувати такий самий ключ? І якщо це так, яким буде механізм аутентифікації, який забезпечує різні рівні доступу користувачів?
КБ

2
@gnat: Я не прошу рекомендації. Я просто запитую, чи існує така послуга, яку я описав. Наявність такої служби послужило б свідченням того, що технологічні бар'єри, про які я задаюсь раніше у питанні, є непосильними.
HC4 - відновлення Моніки

Відповіді:


3

Ви можете зашифрувати кожен рядок окремо. Якщо ви можете дозволити витік назв файлів і приблизної довжини рядків та номерів рядків, у яких відбуваються зміни рядків, ви можете використовувати щось подібне:

https://github.com/ysangkok/line-encryptor

Оскільки кожен рядок шифрується окремо (але з тим самим ключем), до завантажених змін (як правило) залучаються лише відповідні рядки.

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

Рядок шифрувача вище є SCM-агностиком, але може читати уніфіковані файли diff (простого тексту) та шифрувати зміни та застосовувати їх до шифротексту. Це робить його корисним для будь-якого SCM, який генеруватиме вам єдиний розріз (як Git).


Не могли б ви використати для цього гет-мазання ?
svick

@svick: Ви могли, але таким чином, я не бачу, як ви добре дозволили б уникнути повторного шифрування всього файлу. Але звичайно, для коду це мало би мало значення, оскільки розміри файлів невеликі. Але немає потреби в "шифруванні рядків", ви можете просто скористатися будь-яким інструментом шифрування.
Janus Troelsen

Чи не буде багато зразків тексту (з відомою структурою) щось, що полегшило б атаку на ключ? Кожен порожній рядок зашифрував би те саме. Кожен початок і кінець javadoc був би однаковим. Тепер ви знаєте чіткий текст і текст шифру для деякого сегмента коду, який можна використовувати. Це, мабуть, не буде корисним для будь-яких, крім любителів (будь-хто, хто має навчені криптовалюти або достатня обчислювальна потужність, може зламати це з достатньо зусиль).

@MichaelT: Ні, через IV-го. Спробуйте самі :) Використовуючи пов'язану реалізацію, рядки шифруються <IV>,<ciphertext>.
Janus Troelsen

1
@svick: Рядки шифруються окремо. Якщо змінити рядок, весь рядок буде повторно зашифрований, але з новим IV (як завжди). Але решта файлу не торкнеться! Шифрування є детермінованим, але IV також є вхідними даними, і вони вибираються псевдовипадково.
Janus Troelsen

1

Я не думаю, що немає жодних бар'єрів - врахуйте SVN, що надсилається на сервер для зберігання - це дельта між тим, що попередня та поточна версія вашого коду - так що ви змінюєте 1 рядок, саме цей рядок надсилається на сервер. Потім сервер "сліпо" зберігає його, не здійснюючи перевірки самих даних. Якщо ви зашифрували дельту і надіслали, що натомість це не вплине на сервер, насправді вам навіть не потрібно було б змінювати сервер.

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

Це означатиме, що у вас не було веб-сайту з різними функціями перегляду коду, не було веб-переглядача сховища на сервері чи журналу перегляду журналів. Ніякий код не відрізняється, немає інструментів огляду коду в Інтернеті.

Щось подібне вже існує, до певного моменту Mozy зберігає ваші дані, зашифровані вашим приватним ключем (ви можете використовувати їх власний, і вони шумуть, "якщо ви втратите власний ключ, теж погано, ми не можемо відновити ваші дані для ти ", але це більше орієнтоване на звичайного користувача). Mozy також зберігає історію ваших файлів, тому ви можете отримати попередні версії. Там, де воно падає, - це завантаження регулярно, а не перевірка, коли потрібно, і я вважаю, що він відкидає старі версії, коли у вас не вистачає місця для зберігання. Але концепція є, вони могли б модифікувати її, щоб забезпечити безпечний контроль над джерелами за допомогою своєї існуючої системи.


Re: "Це означатиме, що у вас не було веб-сайту з різними функціями перегляду коду, немає веб-переглядача сховища на сервері чи журналу перегляду журналу. Ніякий код не відрізняється, немає інструментів огляду коду в Інтернеті." - Ви все ще можете їх мати, якщо логіка програми була в JS на стороні клієнта, і вона змусила вас ввести свій пароль / ключ (але не відправити його на сервер), правда?
HC4 - відновлення Моніки

Так, це могло б. Все, щоби воно знало, що отримує зашифровані дані по мережі. Це лише очевидне обмеження сервера тим, що він не може розшифрувати дані.
gbjbaanb

1

Я ненавиджу робити одну з таких відповідей "на це не зовсім буде відповідь на ваше запитання", але ..

Я можу придумати два готових рішення, які повинні вирішити ці проблеми.

  1. Розмістіть приватний сервер Git самостійно. Потім поставте цей сервер на VPN, до якого ви надаєте членам вашої команди доступ. Вся комунікація з сервером і з нього буде зашифрована, і ви, звичайно, можете зашифрувати сервер на рівні ОС.

  2. BitSync також повинен виконати трюк. Все було б зашифровано і у величезній мережі, яка була б доступна з будь-якого місця. Насправді це може бути справді гарне застосування всієї цієї технології BitCoin / BitMessage / BitSync ..

Нарешті, люди на веб- сайті /security// можуть мати трохи більше розуміння.


Що стосується BitSync: ви пропонуєте використовувати його як заміну для системи управління версіями чи якось використовувати разом із системою контролю версій? Якщо колишній, то впевнений, але це не дуже цікаво. Я можу так само добре поділитися файлами через SpiderOak, і це було б централізовано, але все ще з нульовим знанням. Якщо останні, то як?
HC4 - відновлення Моніки

1
@ HighCommander4 не пробував, але не повинно бути ніяких підстав для того , щоб не працювати .. Може ви не налаштувати синхронізацію , щоб поділитися ініціалізувала папку GIT, а потім просто зробити нормальний 'git push ./syncedFolderActingAsServer/MyAwesomeProject/src/'? Ви також можете робити дозволи на рівні git тощо. Хтось повинен спробувати це!
Каучукова качка

1

Як я розумію, спосіб git pullроботи полягає в тому, що сервер надсилає вам файл упаковки, який містить усі потрібні вам об'єкти, але наразі їх немає. І навпаки для git push.

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

Для цього pullви завантажуєте всі пакувальні файли, які були додані з останнього часу pull, розшифровуєте їх та застосовуєте до свого git repo. Для цього pushпотрібно спочатку зробити pullтак, щоб ви знали стан сервера. Якщо конфліктів немає, ви створюєте пакувальний файл зі своїми змінами, шифруєте його та завантажуєте.

При такому підході у вас з’явиться велика кількість крихітних файлів пакету, що було б досить неефективно. Щоб виправити це, ви можете завантажити серію файлів упаковки, розшифрувати, об'єднати їх в один файл пакету, зашифрувати та завантажити їх на сервер, позначаючи їх як заміну для цієї серії.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.