Archiviazione di file crittografati. Come semplificare lo schema di gestione delle password?

4

Probabilmente è pubblicizzato, ma non riesco a capire le parole chiave corrette per la ricerca. Puoi aiutare semplicemente dicendomi quelle parole, sto piuttosto bene con Google:)

Voglio sviluppare un po 'come lo storage di file con crittografia di ogni file. C'è un solo utente e tutti i dati (e il codice) sono memorizzati sulla sua macchina locale. L'utente è in grado di importare alcuni file e leggere quelli precedentemente importati.

Requisiti

Il vettore di attacco principale è lettura di dati non autorizzati . Non c'è bisogno di proteggere da file illegali di importazione.

Inoltre, vorrei implementare la negabilità plausibile . Sembrerà così: ci sono due storage in realtà, uno di loro è crittografato con una password vuota ed è OK esporre i suoi contenuti a chiunque. È usato per oscurare il fatto che c'è qualcosa di nascosto. Solo uno scudo aggiuntivo.

La chiave su cui si basa la sicurezza dell'intero sistema è che la password dell'utente è memorizzata solo nella sua testa, i. e. non raggiungibile a livello di codice (a meno che non ci sia keylogger, software telepatico o satellite con fotocamera ad alta risoluzione che può vederti digitando).

Implementazione

Per ora ho finito con il seguente schema.

  1. La password dell'utente è una chiave per crittografare / decifrare le password di livello 2 generate casualmente. Viene utilizzato il simmetrico (ad esempio AES che è considerato sicuro al momento).

  2. La crittografia di livello 2 è asimmetrica. La chiave di crittografia (pubblica) viene utilizzata quando si importano file non crittografati da fonti esterne. La chiave Decription (privata) viene utilizzata per leggere i file. Poiché gli algoritmi asimmetrici sono lenti, queste chiavi sono effettivamente utilizzate per proteggere la chiave di sessione (unica per ogni file). La chiave privata è disponibile in memoria come testo normale solo quando si crittografa la chiave di sessione.

  3. Il livello 3 utilizza nuovamente la crittografia simmetrica, AES o un altro flusso sicuro (solo in caso di prestazioni molto migliori perché la sicurezza è preferibile). Viene utilizzato per crittografare / decrittografare il contenuto del file.

Finalmente hai letto fino alla fine :) Ecco le domande:

  1. Come semplificare questo schema senza danneggiare la sicurezza?

    In breve: rimuovere il livello medio. Devo comunque usare due livelli, per evitare l'affaticamento di Cypher / enthropy e per soddisfare la mia paranoia:)

  2. Come migliorare la sicurezza? So che ci sono bug qui, crypto è una cosa complicata.

    Mille grazie a @DeerHunter per segnalare potenziali difetti.

  3. Cosa google e leggere su questo? Nessuna cosa fondamentale come Shneier, per favore:)

    Bene, ho abbastanza termini e concetti per tuffarmi. Per ora, almeno.

  4. Non sono ancora sicuro se utilizzare i cyphers asimmetrici (nel primo livello). Ho pensato che sarebbe stato utile suddividere i rischi: la chiave di decifrazione (privata) è generata come testo in chiaro solo per un istante, mentre la chiave di crittografia (pubblica) può persino essere esposta a tutti. Ma rispetto ai siffi simmetrici, ho ancora una chiave per proteggere nella RAM, e c'è una chiave aggiuntiva (pubblica) di cui preoccuparsi.

EDIT1 . Io non voglio progettare il mio standard, è ben oltre la mia conoscenza. Userò cose che si dimostrano sicure dove possibile. Per esempio. quello che farò da solo è combinare diverse classi di Crypto ++ per lavorare insieme. Ho solo bisogno del giusto design per farlo. Per ora non penso che la crittografia a disco completo sia adatta nel mio caso. Ho pensato a TrueCrypt, ecc. Ma non consente di nascondere la presenza dei dati crittografati. Preferirei una soluzione (standard o protocollo crittografico) per la crittografia per file.

EDIT2 . Riorganizzato il testo per dividere le richieste e l'implementazione, aggiungendo la richiesta di plausibilità negata

EDIT3 C'è ancora una domanda sulla crittografia asimmetrica.

    
posta Kirill Gamazkov 10.07.2013 - 15:33
fonte

3 risposte

3

Non ho nemmeno finito di leggere il tuo OP per determinare lo schema è troppo complesso.

Alimenta la password dell'utente in una funzione di derivazione della chiave; PBKDF2, dato il numero appropriato di cicli di hashing, va bene. Il valore prodotto è ora la chiave di crittografia simmetrica per tutti i dati, utilizzando AES o qualsiasi algoritmo di crittografia disponibile in commercio. Una volta crittografato, non importa dove viene inserito ciascun file; nessuno può leggere il contenuto del testo in chiaro senza conoscere la password dell'utente (che è un vero segreto) e le impostazioni specifiche per la funzione PBKDF2 (che non lo è) e la modalità di crittografia (idem).

Se desideri che l'utente modifichi la propria password, senza dover decrittografare e crittografare nuovamente l'intero archivio dati, è necessario un intermediario. Genera una chiave casuale e IV per ogni file protetto. Memorizza il nome file, la chiave e IV come una riga di un file di chiavi master, i cui contenuti sono crittografati utilizzando la password dell'utente e un IV costante. Ogni volta che l'utente cambia la propria password, decodifica il file di chiavi utilizzando la vecchia chiave basata sull'utente e l'IV corrente, quindi ricava la nuova chiave dalla nuova password, genera un nuovo IV casuale e ricodifica il file di chiavi.

Se vuoi che l'utente sia in grado di recuperare i propri dati se dimenticano la loro password, allora deve accadere una delle due cose; una copia del file di chiavi master deve essere crittografata utilizzando una chiave nota al sistema host, altrimenti la password dell'utente o la chiave derivata devono essere crittografate in modo simile. Ciò può essere realizzato con chiavi pubbliche che consentono al software client dell'utente di gestire questo passaggio aggiuntivo in modo sicuro. Nel caso in cui sia necessario un ripristino, è possibile applicare la chiave privata per decrittografare il file di chiavi master (direttamente o indirettamente in base al metodo esatto), che può quindi essere crittografato con una password sostitutiva fornita dall'utente.

Altre cose da considerare:

  • In nessun momento la password del testo normale dell'utente o le versioni non crittografate di alcun file, in particolare il file di chiavi master, devono essere permanenti sul disco rigido. Se è mai stato scritto su disco, un utente malintenzionato può scaricare il disco, esaminarne il contenuto e scoprire i segreti dell'utente.
    • Ciò richiede di avere abbastanza controllo sul sistema operativo per garantire che nessuno di questi dati sia mai trasferito dalla RAM al file di paging della memoria virtuale (o che venga rimosso tempestivamente quando non è più necessario).
    • Questo richiede generalmente che tali segreti non siano mai nella RAM per più di un periodo transitorio mentre derivano attivamente la chiave della password o crittografano / decodificano i file protetti. Una volta che non hai più bisogno del testo normale, distruggilo.
  • Il tuo programma crittografa e decrittografa una grande quantità di dati. Ciò potrebbe, col passare del tempo, rendere lo schema vulnerabile alla fatica della cifratura, dove dopo che una grande quantità di dati è stata crittografata, l'entropia inerente ai segreti del codice sarà esaurita e lo stato del codice sarà ripetibile.
    • In genere, questo non è un problema per un singolo file o anche per un grande archivio dati, ma potrebbe essere problematico se si utilizza una chiave per tutto , per sempre .
    • Quindi, non farlo. Ogni volta che l'utente aggiorna un file crittografato, genera una nuova chiave e IV per quel file e aggiorna il file di chiavi master con le nuove informazioni. Poiché ciò richiede la decodifica e la reencrypting del keyfile principale, non è una cattiva idea generare una nuova IV casuale per il passo di reencryption (ovviamente la chiave è relativamente statica, ma queste operazioni sono anche buone opportunità per aumentare la forza del KDF di aumentando il numero di cicli di hashing).
risposta data 10.07.2013 - 23:39
fonte
6

Il primo e probabilmente unico modo per rendere certe cose sicure è non farlo da solo . Implementare correttamente un protocollo crittografico senza divulgare informazioni ovunque sia difficile; progettare un protocollo crittografico è più difficile.

Poiché l'utente importa da sé i file e lo legge, non è assolutamente necessario invocare la crittografia asimmetrica. La crittografia asimmetrica è per quando ci sono (almeno) due giocatori con diritti distinti (ad esempio un firmatario e un verificatore, o un mittente e un destinatario); qui, c'è l'utente e se stesso: lo stesso ragazzo, quindi non c'è bisogno di asimmetria. Un altro modo di vedere è che la crittografia asimmetrica è stata progettata per risolvere il problema della condivisione di informazioni segrete tra più persone. Un utente non ha problemi a condividere informazioni segrete con se stesso.

Quindi la struttura di base è quella di crittografare i file con una chiave derivata da un segreto che si adatta al cervello dell'utente (la password). Questo punta agli strumenti per la crittografia completa del disco, che esistono per molti sistemi operativi. Alcune versioni recenti di Windows sono disponibili con BitLocker . Le buone distribuzioni Linux hanno il loro sistema. Un prodotto di terze parti spesso consigliato per la crittografia completa del disco è TrueCrypt . Usa uno di questi e vivrai più a lungo e più felice.

    
risposta data 10.07.2013 - 16:01
fonte
1

Penso che tu stia parlando di alcune misure di sicurezza che sono confuse.

1) Privilegi: è necessario non garantire alcun accesso alla cartella ovunque il file sia (nascosto o meno). Usa il sistema di privilegi integrato Windows / Linux e assegna i diritti di lettura / scrittura / esecuzione in base agli utenti. Se qualcuno ti ha piantato un virus o ha hackerato il tuo pc e ottenuto i diritti utente root / Sys ... allora sei nei guai.

2) Protezione password / password - AES 128 bit è un algoritmo strong che dovrebbe essere usato per crittografare il contenuto di un file. Ma ricorda che la chiave per la crittografia si trova all'interno del sistema ... se la chiave viene dirottata, il file può essere decodificato .. le chiavi sono effettivamente utilizzate per crittografare e decrittografare i dati nella crittografia simmetrica. Quindi il tuo compito è proteggere la chiave.

3) Encryption Strength- La forza della crittografia ha alcuni fattori, è necessario utilizzare una crittografia non prevedibile e utilizzare buoni elementi di diffusione, confusione, effetto valanga, Initialization Vectors (IV) e un potente generatore Keystream per creare un buon keytream strong.

4) Gestione password utente: la password dell'utente deve essere strong, composta da caratteri alfanumerici e non alfanumerici. Inoltre, il pannello della voce della password non dovrebbe essere facile da forzare, usare captcha o rallentare il tempo ogni volta che viene effettuato un tentativo errato, che impedirebbe la forza bruta.

    
risposta data 10.07.2013 - 21:32
fonte

Leggi altre domande sui tag