Sicurezza della re-crittografia con un elenco di chiavi basate su password pre-calcolate

2

Ho un problema in cui un file crittografato memorizzato su un server deve essere decodificato attraverso un elenco precompilato di password che vengono utilizzate una sola volta - OTP applicato sostanzialmente alla crittografia. Il file è in uno stato sicuro mentre è attivo e decrittografato, non può essere modificato o visto pubblicamente. Mentre è a riposo, è pubblicamente visualizzabile e modificabile, quindi non posso memorizzare un elenco di password sul server, poiché spesso il server non è in uno stato sicuro e il file deve essere trasferito spesso in un ambiente molto pubblico modo in cui sarà quasi sicuramente visibile. Dopo aver discusso di questo con un amico, è stato suggerito qualcosa basato su Diffie-Hellman. La mia domanda è quanto potrebbe essere sicuro.

Concetto
L'idea è di generare un elenco di hash e memorizzare solo l'elenco di g^H_n insieme al file crittografato. Il file viene crittografato ogni volta prendendo un hash, g^H_n , un valore di lavoro casuale r e crittografando il file con la chiave (g^H_n)^r . Infine g^r è memorizzato nel file pubblicamente. Per decodificare, l'utente fornisce H_n che può essere utilizzato per calcolare (g^r)^H_n e decrittografare il file. Ricodificare è quindi semplicemente fare la stessa cosa con g^H_(n-1) preso dalla lista, e un nuovo valore di lavoro casuale.

Se in qualsiasi momento il file viene ottenuto da qualcuno pubblicamente (ad esempio quando il file è a riposo), conoscono solo g^r , che non può essere utilizzato per calcolare la chiave. A prescindere dall'ultimo hash utilizzato per crittografare, tutti gli altri hash sono crittografati insieme al file, quindi le future chiavi non possono essere manomesse.

Domanda
Sembra che funzioni abbastanza bene, ma sono nervoso nel fare qualcosa di simile senza sapere con quanta facilità possa essere interrotto, e non riesco a trovare alcun metodo esistente per fare la stessa cosa. Spero che qualcuno possa evidenziare eventuali grossi difetti in questo aspetto che potrebbero essere stati trascurati.

    
posta Dave 17.10.2012 - 19:03
fonte

1 risposta

3

Se capisco correttamente il tuo problema, quello che vuoi è quello, per un dato file:

  • Un file è memorizzato su un server non attendibile.
  • Esiste una lista ordinata di password che sono "allegate" al file (ma un bit memorizzato con il file).
  • Quando è a riposo, il file deve essere crittografato con la prima password della lista (cioè crittografata con una chiave che può essere ricalcata dalla conoscenza della password).
  • Quando la password viene inviata al server, il server decodifica il file con esso, fa "qualcosa" con i dati decrittografati (es. lo restituisce all'utente) e reencrripta il file con il password successiva nell'elenco.
  • Il server non ha una conoscenza permanente delle password stesse.

Ciò implica che ci sono momenti in cui il server "vede" i dati decrittografati, quindi il server non deve essere totalmente non attendibile. Presumo che siamo interessati a proteggere i dati a riposo (scenario: l'attaccante ruba un nastro di backup per il server, e quindi ha accesso in lettura ai file memorizzati, ma non alla RAM del server). Sono non studiare gli attacchi attivi qui; se l'attaccante può modificare i dati del server, allora si hanno problemi più grandi. Un altro punto importante è che ciò che il server contiene è necessariamente vulnerabile agli attacchi dizionario (conoscenza di cosa il server sa, oltre alla password corrente, è sufficiente per recuperare i dati) quindi le password devono essere forti (alta entropia, bcrypt ...).

Le caratteristiche sopra implicano che il server deve essere in grado di crittografare dati relativamente a una password che non conosce, quindi questo richiede una crittografia asimmetrica. Quello che suggerisci è funzionalmente equivalente all'archiviazione con il file di una sequenza di chiavi private protette da password, insieme alle loro chiavi pubbliche: la password, quando fornita, sblocca la chiave privata, che viene utilizzata per la decrittografia, e la ricodifica immediata utilizza il prossima chiave pubblica nella lista. Il tuo g H n è solo una protezione della password della chiave privata: la chiave privata è la (hash della) password e il valore memorizzato è la chiave pubblica.

Se vuoi attenersi a standard ben studiati (che è saggio!), considera OpenPGP . Include formati per l'archiviazione di chiavi pubbliche, chiavi private protette da password e crittografia di dati in blocco. È supportato da librerie esistenti (ad es. GnuPG o Castello gonfiabile ).

Un formato semplificato potrebbe essere definito lungo le linee che hai pensato (possibilmente con curve ellittiche, per ridurre la dimensione della lista di chiavi), ma sarebbe un tentativo piuttosto grande con molte cose che possono andare storte (il hashing della password, la crittografia simmetrica, i dettagli di Diffe-Hellman, una possibile indiretta per accelerare il passo della ricodifica ... tutto si aggiunge alla complessità).

    
risposta data 17.10.2012 - 19:44
fonte

Leggi altre domande sui tag