Null-Wissen-Code-Hosting? [geschlossen]


28

Angesichts der jüngsten Enthüllungen über die weit verbreitete behördliche Überwachung von Daten, die von Onlinediensteanbietern gespeichert werden, sind Zero-Knowledge-Dienste derzeit im Trend.

Bei einem Zero-Knowledge-Service werden alle Daten verschlüsselt mit einem Schlüssel gespeichert, der nicht auf dem Server gespeichert ist. Die Ver- und Entschlüsselung erfolgt vollständig auf der Clientseite, und der Server sieht weder Klartextdaten noch den Schlüssel. Infolgedessen kann der Dienstanbieter die Daten nicht entschlüsseln und an Dritte weitergeben, selbst wenn dies gewünscht wird.

Ein Beispiel: SpiderOak kann als wissensfreie Version von Dropbox angesehen werden.

Als Programmierer verlassen wir uns in hohem Maße auf einige unserer sensibelsten Daten - unseren Code - und vertrauen auf eine bestimmte Klasse von Onlinedienstanbietern: Codehostinganbieter (wie Bitbucket, Assembla usw.). Ich spreche hier natürlich von privaten Repositories - das Konzept des Null-Wissens ist für öffentliche Repositories nicht sinnvoll.

Meine Fragen sind:

  1. Gibt es technologische Hindernisse für die Schaffung eines wissensfreien Code-Hosting-Dienstes? Gibt es beispielsweise etwas an den Netzwerkprotokollen, die von gängigen Versionskontrollsystemen wie SVN, Mercurial oder Git verwendet werden, das die Implementierung eines Schemas erschwert (oder unmöglich macht), bei dem die zwischen dem Client und dem Server übertragenen Daten verschlüsselt werden einen Schlüssel, den der Server nicht kennt?

  2. Gibt es heute wissensfreie Code-Hosting-Dienste?


1
Ohne homomorphe Verschlüsselung sehe ich keinen Vorteil für eine Zero-Knowledge-Code-Hosting-Site gegenüber einer Zero-Knowledge-Version von Drop-Box. Ich glaube noch niemand hat sich ein solches Schema ausgedacht, das sowohl sicher (dh sicher genug, dass die Experten ihm vertrauen) als auch schnell genug ist, um verwendbar zu sein.
Brian

2
@AndresF. Ich kann nur annehmen, dass SpiderOak bedeutet, dass die Diff-Generierung auf dem Client stattfindet, der Server verschlüsselte Diffs speichert und die Diff-to-Base-Anwendung erneut auf dem Client stattfindet, wenn Diff und Base verschlüsselt sind. Ich stimme zu, dass ihre Sprache sehr unklar ist.
Apsillers

2
@apsillers: Oder Sie können solche Inhalte absichtlich in eine Datei einfügen und damit die Datei selbst identifizieren (z. B., wenn jemand versucht hat, die Piraterie durch Verschlüsselung zu verbergen).
Brian

4
Ich habe keine Erfahrung damit, aber ich kann mir eine mögliche technologische Hürde für einen wissensfreien Code-Hosting-Service vorstellen: Müssen nicht alle Benutzer denselben Schlüssel kennen / verwenden? Und wenn dies der Fall ist, welcher Authentifizierungsmechanismus gewährleistet dann unterschiedliche Benutzerzugriffsebenen?
CB

2
@gnat: Ich bitte nicht um eine Empfehlung. Ich frage nur, ob ein Service der von mir beschriebenen Art existiert. Die Existenz eines solchen Dienstes würde den Beweis erbringen, dass die technologischen Hindernisse, die ich früher in der Frage gestellt habe, überwunden werden können.
HC4 - Monica

Antworten:


3

Sie können jede Zeile einzeln verschlüsseln. Wenn Sie es sich leisten können, Ihre Dateinamen und die ungefähre Zeilenlänge sowie die Zeilennummern, bei denen Änderungen auftreten, zu verlieren, können Sie Folgendes verwenden:

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

Da jede Zeile separat (aber mit demselben Schlüssel) verschlüsselt wird, betreffen die hochgeladenen Änderungen (wie gewöhnlich) nur die relevanten Zeilen.

Wenn es derzeit nicht bequem genug ist, können Sie zwei Git-Repositorys erstellen, eines mit Klartext und eines mit Chiffretext. Wenn Sie im Klartext-Repository (das lokal ist) ein Commit durchführen, könnte ein Commit-Hook das Diff verwenden und es über den oben genannten Zeilenverschlüsseler ausführen, der es auf das Chiffretext-Repository anwendet. Die Änderungen am Chiffretext-Repository werden festgeschrieben und hochgeladen.

Der obige Zeilenverschlüsseler ist SCM-unabhängig, kann jedoch vereinheitlichte Diff-Dateien (im Klartext) lesen, die Änderungen verschlüsseln und auf den Chiffretext anwenden. Dies macht es auf jedem SCM verwendbar, der ein einheitliches Diff erzeugt (wie Git).


Könnten Sie nicht Gits Fleckentferner verwenden ?
Svick

@svick: Sie könnten, aber auf diese Weise sehe ich nicht, wie Sie es gut zulassen würden, dass die gesamte Datei nicht erneut verschlüsselt wird. Aber für Code ist es natürlich nicht wichtig, da die Dateigrößen klein sind. Es ist jedoch kein "Leitungsverschlüsseler" erforderlich, Sie können einfach ein beliebiges Verschlüsselungswerkzeug verwenden.
Janus Troelsen

Wären nicht viele Textbeispiele (mit einer bekannten Struktur) etwas, das es einfacher machen würde, den Schlüssel anzugreifen? Jede leere Zeile würde dasselbe verschlüsseln. Jeder Anfang und jedes Ende eines Javadocs wäre gleich. Jetzt kennen Sie den Klartext und den Chiffretext für einen Teil des Codes, der verwendet werden kann. Dies wäre wahrscheinlich nur für Hobby-Fans von Nutzen (jeder mit geschulten Kryptotypen oder ausreichender Rechenleistung könnte es mit ausreichendem Aufwand lösen).

@MichaelT: Nein, wegen IV's. Probieren Sie es aus :) Verwenden Sie die verknüpfte Implementierung, um Zeilen zu verschlüsseln <IV>,<ciphertext>.
Janus Troelsen

1
@svick: Zeilen werden einzeln verschlüsselt. Wenn Sie eine Zeile ändern, wird die gesamte Zeile neu verschlüsselt, jedoch mit einer neuen IV (wie immer). Aber der Rest der Datei wird nicht berührt! Die Verschlüsselung ist deterministisch, aber die IVs sind auch Eingaben und werden pseudozufällig ausgewählt.
Janus Troelsen

1

Ich glaube nicht, dass es irgendwelche Hindernisse gibt - bedenken Sie, dass SVN, was zum Speichern an den Server gesendet wird, das Delta zwischen der vorherigen und der aktuellen Version Ihres Codes ist. Sie ändern also 1 Zeile, nur diese Zeile wird an den Server gesendet. Der Server speichert sie dann "blind", ohne die Daten selbst zu überprüfen. Wenn Sie das Delta verschlüsselt und stattdessen gesendet hätten, hätte dies keine Auswirkungen auf den Server. Tatsächlich müssten Sie den Server überhaupt nicht ändern.

Es gibt andere wichtige Elemente, z. B. Metadateneigenschaften, die nicht leicht verschlüsselt werden können (z. B. MIME-Typ), aber andere können verschlüsselt werden, z. B. Kommentare im Verlaufsprotokoll, sofern Sie wissen, dass Sie sie auf dem entschlüsseln müssen Client zu sehen. Ich bin mir nicht sicher, ob die Verzeichnisstruktur sichtbar wäre. Ich denke, dass sie aufgrund der Art und Weise, wie SVN Verzeichnisse speichert, nicht sichtbar wäre, aber ich liege möglicherweise falsch. Dies ist für Sie jedoch möglicherweise nicht wichtig, wenn die Inhalte sicher sind.

Dies würde bedeuten, dass Sie keine Website mit den verschiedenen Funktionen der Codeansicht, keinem serverseitigen Repository-Browser oder Protokoll-Viewer haben könnten. Keine Code-Unterschiede, keine Online-Tools zur Codeüberprüfung.

So etwas gibt es bereits. Bis zu einem gewissen Punkt speichert Mozy Ihre Daten verschlüsselt mit Ihrem privaten Schlüssel (Sie können ihre eigenen verwenden und sie machen Geräusche über "Wenn Sie Ihren eigenen Schlüssel verlieren, leider können wir Ihre Daten für nicht wiederherstellen." Sie ", aber das ist mehr auf den gemeinsamen Benutzer ausgerichtet). Mozy speichert auch einen Verlauf Ihrer Dateien, sodass Sie frühere Versionen abrufen können. Das Problem ist, dass das Hochladen regelmäßig und nicht zum gewünschten Zeitpunkt erfolgt. Ich glaube, dass alte Versionen verworfen werden, wenn der Speicherplatz knapp wird. Aber das Konzept ist da, sie könnten es modifizieren, um eine sichere Quellcodeverwaltung unter Verwendung ihres vorhandenen Systems bereitzustellen.


Betreff: "Dies würde bedeuten, dass Sie keine Website mit den verschiedenen Funktionen der Codeansicht, keinem serverseitigen Repository-Browser oder Protokoll-Viewer haben könnten. Keine Code-Unterschiede, keine Online-Tools zur Code-Überprüfung." - Sie könnten diese weiterhin haben, wenn die Anwendungslogik in clientseitigem JS war und Sie dazu gebracht wurden, Ihr Kennwort / Ihren Schlüssel einzugeben (aber nicht an den Server zu senden), richtig?
HC4 - wieder Monica

Ja, es könnte ... Alles, solange es weiß, dass es verschlüsselte Daten über das Netzwerk empfängt. Es ist nur eine offensichtliche Einschränkung des Servers, dass er die Daten nicht entschlüsseln kann.
Gbjbaanb

1

Ich hasse es, eine dieser Antworten zu machen: "Das wird Ihre Frage nicht ganz beantworten." Aber ...

Ich kann mir zwei fertige Lösungen vorstellen, die diese Probleme angehen sollten.

  1. Hosten Sie einen privaten Git-Server auf eigene Faust. Stellen Sie diesen Server dann in ein VPN, auf das Sie Ihren Teammitgliedern Zugriff gewähren. Die gesamte Kommunikation zum und vom Server wird verschlüsselt, und Sie können den Server natürlich auch auf Betriebssystemebene verschlüsseln.

  2. BitSync sollte auch den Trick machen. Alles wäre verschlüsselt und in einem riesigen Netzwerk, das überall verfügbar wäre. Könnte tatsächlich eine wirklich gute Anwendung all dieser BitCoin / BitMessage / BitSync-Technologie sein.

Schließlich könnten die Leute unter https://security.stackexchange.com/ noch mehr Einblick haben.


In Bezug auf BitSync: Schlagen Sie vor, es als Ersatz für ein Versionskontrollsystem oder in irgendeiner Weise zusammen mit einem Versionskontrollsystem zu verwenden? Wenn erstere, dann sicher, aber das ist nicht sehr interessant. Ich könnte die Dateien genauso gut über SpiderOak teilen und es wäre zentralisiert, aber immer noch ohne Wissen. Wenn letzteres, wie dann?
HC4 - Monica

1
@ HighCommander4 Habe es noch nicht ausprobiert, sollte aber keinen Grund dafür geben, dass es nicht funktioniert. Konnten Sie die Synchronisierung nicht so einrichten, dass Ihr initialisierter Git-Ordner freigegeben wird, und dann einfach einen normalen Vorgang ausführen 'git push ./syncedFolderActingAsServer/MyAwesomeProject/src/'? Sie könnten auch Git-Level-Berechtigungen usw. machen. Jemand sollte dies versuchen!
Rubber Duck

1

Soweit ich weiß, git pullsendet der Server Ihnen eine Paketdatei, die alle gewünschten Objekte enthält, aber derzeit keine enthält. Und umgekehrt für git push.

Ich denke, Sie könnten es nicht direkt so machen (weil dies bedeutet, dass der Server die Objekte verstehen muss). Stattdessen können Sie den Server nur mit einer Reihe von verschlüsselten Paketdateien arbeiten lassen.

Dazu pullladen Sie alle Pack-Dateien herunter, die seit Ihrem letzten Hinzufügen hinzugefügt wurden pull, entschlüsseln sie und wenden sie auf Ihr Git-Repo an. Dazu müssen pushSie zunächst pullden Status des Servers kennen. Wenn keine Konflikte vorliegen, erstellen Sie eine Paketdatei mit Ihren Änderungen, verschlüsseln sie und laden sie hoch.

Mit diesem Ansatz würden Sie eine große Anzahl winziger Packdateien erhalten, was ziemlich ineffizient wäre. Um dies zu beheben, können Sie eine Reihe von Paketdateien herunterladen, entschlüsseln, zu einer Paketdatei kombinieren, verschlüsseln und auf den Server hochladen und diese als Ersatz für diese Reihe markieren.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.