Hosting di codice a conoscenza zero? [chiuso]


28

Alla luce delle recenti rivelazioni sul diffuso monitoraggio da parte del governo dei dati archiviati dai fornitori di servizi online, i servizi a conoscenza zero sono di gran moda ora.

Un servizio a conoscenza zero è uno in cui tutti i dati sono archiviati crittografati con una chiave che non è memorizzata sul server. La crittografia e la decrittografia avvengono interamente sul lato client e il server non vede mai né i dati in chiaro né la chiave. Di conseguenza, il fornitore di servizi non è in grado di decrittografare e fornire i dati a terzi, anche se lo desiderasse.

Per fare un esempio: SpiderOak può essere visualizzato come una versione a conoscenza zero di Dropbox.

Come programmatori, facciamo molto affidamento e affidiamo alcuni dei nostri dati più sensibili - il nostro codice - a una particolare classe di fornitori di servizi online: fornitori di hosting di codice (come Bitbucket, Assembla e così via). Sto ovviamente parlando di repository privati ​​qui - il concetto di conoscenza zero non ha senso per i repository pubblici.

Le mie domande sono:

  1. Esistono ostacoli tecnologici alla creazione di un servizio di hosting di codice a conoscenza zero? Ad esempio, c'è qualcosa nei protocolli di rete utilizzati dai sistemi di controllo versione popolari come SVN, Mercurial o Git che renderebbe difficile (o impossibile) implementare uno schema in cui i dati che vengono comunicati tra il client e il server sono crittografati con una chiave che il server non conosce?

  2. Esistono attualmente servizi di hosting di codice a conoscenza zero?


1
Senza la crittografia omomorfa , non vedo come un sito di hosting di codice a conoscenza zero possa fornire qualsiasi tipo di vantaggio rispetto a una versione a conoscenza zero di drop-box. Non credo che nessuno abbia ancora messo a punto un sistema del genere che sia sia sicuro (cioè abbastanza sicuro che gli esperti si fidino di esso) sia abbastanza veloce da essere utilizzabile.
Brian,

2
@AndresF. Posso solo supporre che SpiderOak significhi che la generazione di diff si verifica sul client, il server memorizza i diff crittografati e quindi l'applicazione diff-to-base si verifica nuovamente sul client quando il diff e la base sono crittografati. Sono d'accordo che la loro lingua non è chiara.
apsillers

2
@apsillers: Oppure puoi deliberatamente inserire tali contenuti in un file e utilizzarlo per identificare il file stesso (ad esempio, se qualcuno stesse cercando di utilizzare la crittografia per nascondere la pirateria).
Brian,

4
Non è qualcosa in cui ho alcuna esperienza, ma posso immaginare una possibile barriera tecnologica per avere un servizio di hosting di codice a conoscenza zero: non tutti gli utenti dovranno conoscere / usare la stessa identica chiave? E in tal caso, quale sarà il meccanismo di autenticazione che garantisce diversi livelli di accesso dell'utente?
CB

2
@gnat: non sto chiedendo una raccomandazione. Sto semplicemente chiedendo se esiste un servizio del tipo che ho descritto. L'esistenza di un tale servizio fornirebbe la prova che le barriere tecnologiche che chiedo in precedenza nella domanda sono esagerate.
HC4 - Ripristina Monica il

Risposte:


3

È possibile crittografare ciascuna riga separatamente. Se puoi permetterti di perdere i nomi dei file e la lunghezza approssimativa delle linee e i numeri delle linee su cui si verificano le modifiche delle linee, puoi usare qualcosa del genere:

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

Poiché ogni riga viene crittografata separatamente (ma con la stessa chiave), le modifiche caricate coinvolgeranno (come di solito) solo le righe pertinenti.

Se al momento non è abbastanza conveniente, potresti creare due repository Git, uno con testo in chiaro e uno con testo cifrato. Quando esegui il commit nel repository di testo in chiaro (che è locale), un hook di commit potrebbe prendere il diff ed eseguirlo attraverso il codificatore di linea sopra indicato, che lo applicherebbe al repository di testo cifrato. Le modifiche al repository di testo cifrato verrebbero salvate e caricate.

Il codificatore di riga sopra è SCM agnostico, ma può leggere file diff unificati (di testo in chiaro) e crittografare le modifiche e applicarle al testo cifrato. Questo lo rende utilizzabile su qualsiasi SCM che genererà un diff unificato (come Git).


Non potresti usare git's smudge-clean per questo?
svick,

@svick: Potresti, ma in questo modo, non vedo come permetteresti di evitare di ri-crittografare l'intero file. Ma, naturalmente, non importerebbe molto per il codice poiché le dimensioni del file sono piccole. Ma non è necessario un "codificatore di linea", quindi puoi semplicemente utilizzare qualsiasi strumento di crittografia.
Janus Troelsen,

Un sacco di esempi di testo (con una struttura nota) sarebbe qualcosa che renderebbe più semplice attaccare la chiave? Ogni riga vuota avrebbe crittografato lo stesso. Ogni inizio e fine di un javadoc sarebbe lo stesso. Ora conosci il testo in chiaro e il testo cifrato per alcuni segmenti del codice che possono essere utilizzati. Questo probabilmente non sarebbe utile contro nessuno tranne gli hobbisti (chiunque abbia tipi crittografici addestrati o una potenza di calcolo sufficiente potrebbe romperlo con sufficiente sforzo).

@MichaelT: No, per via degli IV. Provalo tu stesso :) Utilizzando l'implementazione collegata, le linee crittografano <IV>,<ciphertext>.
Janus Troelsen,

1
@svick: le linee sono criptate singolarmente. Se si modifica una riga, l'intera riga verrebbe nuovamente crittografata, ma con un nuovo IV (come sempre). Ma il resto del file non verrà toccato! La crittografia è deterministica, ma anche gli IV sono input e sono scelti in modo pseudo-casuale.
Janus Troelsen,

1

Non credo che ci siano ostacoli - considera SVN, ciò che viene inviato al server per l'archiviazione è il delta tra quello che la versione precedente e quella attuale del tuo codice - quindi cambi 1 riga, solo quella riga viene inviata al server. Il server quindi lo memorizza "alla cieca" senza fare alcuna ispezione dei dati stessi. Se si crittografasse il delta e lo si inviasse invece, non ci sarebbe alcun impatto sul server, in effetti non sarebbe nemmeno necessario modificarlo affatto.

Ci sono altri bit che potrebbero interessare, come le proprietà dei metadati che non sono facilmente crittografabili - come il tipo mime - ma altri potrebbero essere crittografati, ad esempio commenti nel registro cronologico, purché tu sappia che devi decrittografarli sul client da visualizzare. Non sono sicuro che la struttura delle directory sia visibile, penso che non sarebbe visibile a causa del modo in cui SVN archivia le directory, ma è possibile che mi sbagli. Questo potrebbe non importarti se i contenuti sono comunque sicuri.

Ciò significherebbe che non è possibile avere un sito Web con le varie funzionalità di visualizzazione del codice, nessun browser di repository sul lato server o visualizzatore di log. Nessuna differenza di codice, nessuno strumento di revisione del codice online.

Qualcosa del genere esiste già, a un certo punto, Mozy memorizza i tuoi dati crittografati con la tua chiave privata (puoi usarne uno proprio e fanno dei rumori su "se perdi la tua chiave, peccato, non possiamo ripristinare i tuoi dati per tu ", ma è più mirato all'utente comune). Mozy memorizza anche una cronologia dei tuoi file, in modo da poter recuperare le versioni precedenti. Il problema è che il caricamento è su base regolare, non il check-in quando lo si desidera e credo che scarti le vecchie versioni quando si esaurisce lo spazio di archiviazione. Ma il concetto è lì, potrebbero modificarlo per fornire un controllo sicuro del codice sorgente usando il loro sistema esistente.


Ri: "Ciò significherebbe che non si potrebbe avere un sito Web con le varie funzionalità di visualizzazione del codice, nessun browser di repository sul lato server o visualizzatore di log. Nessun codice diff, nessun strumento di revisione del codice online." - Potresti comunque avere questi se la logica dell'applicazione era in JS lato client e ti ha fatto inserire la tua password / chiave (ma non inviarla al server), giusto?
HC4 - Ripristina Monica il

Sì, potrebbe ... Qualsiasi cosa purché sapesse che stava ricevendo dati crittografati sulla rete. È solo un'ovvia limitazione del server che non può decrittografare i dati.
gbjbaanb,

1

Odio fare una di quelle risposte "questa non è abbastanza per rispondere alla tua domanda" .. ma ..

Mi vengono in mente due soluzioni pronte che dovrebbero affrontare queste preoccupazioni.

  1. Ospita un server Git privato da solo. Quindi metti quel server su una VPN a cui dai accesso ai membri del tuo team. Tutte le comunicazioni da e verso il server sarebbero crittografate e si potrebbe ovviamente crittografare il server a livello di sistema operativo.

  2. BitSync dovrebbe fare anche il trucco. Tutto sarebbe crittografato e in una rete enorme che sarebbe disponibile da qualsiasi luogo. Potrebbe davvero essere un'ottima applicazione di tutta questa tecnologia BitCoin / BitMessage / BitSync.

Infine, la gente su /security// potrebbe avere qualche informazione in più.


Per quanto riguarda BitSync: stai suggerendo di usarlo come sostituto di un sistema di controllo versione o in qualche modo usato insieme a un sistema di controllo versione? Se il primo, allora certo, ma non è molto interessante. Potrei anche condividere i file su SpiderOak e sarebbe centralizzato, ma ancora a conoscenza zero. Se quest'ultimo, allora come?
HC4 - Ripristina Monica il

1
@ HighCommander4 Non l'ho provato, ma non dovrebbe esserci alcun motivo per non funzionare .. Non potresti impostare la sincronizzazione per condividere la tua cartella git inizializzata, quindi fare semplicemente una cosa normale 'git push ./syncedFolderActingAsServer/MyAwesomeProject/src/'? Potresti anche fare permessi di livello git, ecc. Qualcuno dovrebbe provare questo!
Rubber Duck,

1

A quanto ho capito, il modo in cui git pullfunziona è che il server ti manda un file pack che contiene tutti gli oggetti che vuoi, ma che non hai al momento. E viceversa per git push.

Penso che non puoi farlo direttamente in questo modo (perché questo significa che il server deve capire gli oggetti). Quello che potresti fare invece è far funzionare il server solo con una serie di file pack crittografati.

Per fare ciò pull, scarichi tutti i file del pacchetto che sono stati aggiunti dal tuo ultimo pull, li decifrano e li applichi al tuo repository git. Per fare push, devi prima fare pull, in modo da conoscere lo stato del server. Se non ci sono conflitti, si crea un file pack con le modifiche, lo si crittografa e lo si carica.

Con questo approccio, si otterrebbe un gran numero di piccoli file pack, il che sarebbe abbastanza inefficiente. Per risolvere questo problema, è possibile scaricare una serie di file pack, decrittografarli, combinarli in un file pack, crittografarli e caricarli sul server, contrassegnandoli come sostituti di quella serie.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.