Crittografia: crittografia con password senza memorizzarla

2

Sto lavorando su un'applicazione desktop in cui gestiamo dati sensibili e vogliamo crittografare i file locali con una password che chiediamo all'utente quando apre l'applicazione. Nella maggior parte dei progetti simili, vediamo che le persone memorizzano un hash della password in modo che possano verificare che la password sia valida prima di provare a decodificare tutto. Questo espone un problema di sicurezza, perché l'hash può essere facilmente estratto e forzato brutemente esternamente.

Quello che vogliamo fare è mettere un testo statico all'inizio del file per decrittografarlo, e quando l'utente inserisce la password, l'applicazione prova a decifrare quel timbro e se può, significherebbe che la password è valida e quindi potrebbe procedere alla decrittografia del resto del file.

È sicuro? Dal momento che non l'ho visto da nessuna parte, non sono sicuro di aver trascurato qualcosa che potrebbe rendere vulnerabile questo sistema.

    
posta SaltyHacker 27.06.2017 - 22:42
fonte

5 risposte

1

TL; DR: usa una funzione di derivazione della chiave appropriata invece di uno schema homegrown.

the hash can easily be extracted and brute-forced externally.

Penso che stiate sottovalutando la difficoltà di un attacco preimage su una moderna funzione di hash delle password.

Is it safe? Since I haven't seen this anywhere, I'm not sure if I overlooked something that could make this system vulnerable.

Fatto bene, ciò che proponi potrebbe non essere vulnerabile in realtà, ma probabilmente non ti comprerebbe molto. Fatto male, come discusso nelle risposte precedenti, può diventare orribilmente insicuro.

Fondamentalmente, quando pensi alle password di hashing, non pensare solo a un singolo giro della tua funzione hash crittografica media come MD5 o SHA512. Invece, la tua prima scelta dovrebbe essere quella di utilizzare una funzione di derivazione della chiave basata su password correttamente salata . Ce ne sono molti disponibili, ma le scelte più popolari attualmente sembrano essere PBKDF2 e bcrypt , con scrypt in crescita in popolarità.

A differenza delle semplici primitive di hash, le funzioni di derivazione della chiave sono specificatamente progettate per essere lente e cercano di dare a un utente malintenzionato il minimo vantaggio possibile, anche laddove l'hacker sia in grado di utilizzare hardware personalizzato per attaccare la password inserita dall'utente, anche se la password ha un'entropia relativamente bassa.

È ancora possibile memorizzare qualcosa che indica se la password è corretta. Ad esempio, LUKS esegue questa operazione memorizzando un hash crittografato salato della chiave master; se la passphrase fornita dall'utente non decodifica correttamente nessuno degli slot della chiave, la decrittografia dei dati della chiave master nello slot della chiave produrrà un risultato errato, risultante in un diverso hash della chiave principale, che viene rilevato e applicato come un risultato "passphrase errato". Si noti in questo caso che l'hash della passphrase stessa non è memorizzato. Confronta il formato su disco di LUKS , figura 1 PHDR Layout .

    
risposta data 28.06.2017 - 08:46
fonte
2

Prova a utilizzare qualcosa come PBKDF2 per trasformare la password in una chiave, con cui crittografare il file. PBKDF2 fornisce salatura e configurazione iterativa per rendere più difficile la forza bruta.

    
risposta data 27.06.2017 - 23:14
fonte
1

Ciò che stai proponendo è la cosa esatta che desideri evitare.

Si propone di includere un breve passaggio crittografato o un testo in chiaro statico all'inizio del testo. Ma ... questo è esattamente ciò che è un hash della password! Qualunque sia il processo che hai pianificato di utilizzare per decodificare il blocco di testo, potrebbe essere bruto-forzato esattamente allo stesso modo dell'hash.

Ma faresti qualcosa di peggio. Verrà fornito all'attaccante un attacco con testo in chiaro, con un numero molto elevato di permutazioni, uno per ogni messaggio crittografato sul sistema. Perché dovresti farlo?

Hai appena fatto un hash della password di un povero uomo molto rotto.

Invece, segui le best practice:

  • Scegli un sistema di hashing sicuro e lento delle password con un numero di bit troppo elevato per poter essere decodificato in un tempo ragionevole o in grado di supportare la tabella arcobaleno.
  • Scegli buoni sali casuali per impedire che password identiche abbiano hash identici.
  • Genera un buon pepe statico e proteggi bene il tuo codice, in modo che il semplice lancio di un dizionario al tuo hash della password non sia sufficiente per decifrare anche la più semplice password "aaa" a meno che non scoprano prima il pepe.

Quindi, certo. Fai in modo che l'hash sia la prima cosa che cripti con la tua cifra di blocco, se ti fa sentire più sicuro. Alcuni sosterranno che questo effettivamente lo indebolisce; probabilmente non è vero nella maggior parte dei casi, semplicemente non lo rafforza molto e spreca alcuni cicli della CPU.

    
risposta data 27.06.2017 - 23:23
fonte
1

On most similar project, we see that people store a hash of the password so they can verify that the password is valid before trying to decrypt everything. That exposes a security problem, because the hash can easily be extracted and brute-forced externally.

Questa è una soluzione errata, ma non per il motivo che offri. La verità è che lo schema di crittografia qualsiasi in cui una password è l'unico segreto consente a un utente malintenzionato di effettuare e verificare le ipotesi di password. Questo problema può essere evitato solo richiedendo qualcos'altro oltre a una password.

What we want to do is putting a static text at the beginning of the file to decrypt, And when the user enters the password, the application tries to decrypt that stamp and if it can, it would mean the password is valid and then he could proceed to decrypt the rest of the file.

Ciò è errato perché stai cercando di utilizzare la crittografia come verifica della validità della password, ma la crittografia non fornisce tale garanzia.

La soluzione giusta qui è abbastanza complicata e molto facile da sbagliare. Cosa posso dire, cripto è difficile. Per crittografare un file, ecco uno schema incompleto dei passaggi:

  1. Ogni volta che crittografa nuovamente alcuni dati, genera un nuovo salt casuale con un generatore di numeri casuali crittograficamente sicuro.
  2. Utilizzare una funzione di derivazione della chiave basata su password come PBKDF2, scrypt o Argon2id per derivare le chiavi di crittografia dal sale casuale e una password immessa dall'utente.
  3. Utilizza la chiave derivata per crittografare i dati con un crittografia autenticata algoritmo (noto anche come AEAD), con il sale come dati associati. L'AEAD emetterà un testo cifrato autenticato che contiene un tag di autenticazione che verrà controllato durante la decrittazione.
  4. Scrivi il sale e il testo cifrato nel file.

Per decodificare un file:

  1. Leggi il sale dal file crittografato.
  2. Chiedi all'utente la password e utilizza la password salt fornita per ricostruire la chiave.
  3. Prova a decrittografare il testo cifrato. Poiché utilizzi un AEAD, se la password non è corretta la decrittografia fallirà con un errore di autenticità.

Un modo per migliorare un po 'la sicurezza è archiviare i sali da qualche altra parte tranne il file, dove è improbabile che un utente malintenzionato lo trovi. Ad esempio, il gestore password 1Password chiama salt la "chiave segreta" che memorizza nei dispositivi separatamente dal file di password va crittografato. La sincronizzazione online trasferisce il testo cifrato ma la chiave segreta deve essere copiata manualmente tra i dispositivi dall'utente.

    
risposta data 28.06.2017 - 03:58
fonte
-1

Dipende da quante volte hai cancellato il valore della password. Certo, se lo fai una volta, sarà sicuramente più facile craccare la password.

La mia raccomandazione è di cancellare la password 100.000 volte, invece, e anteporre quella al file crittografato.

Non solo userete un metodo di autenticazione molto più semplice, ma può ancora dimostrarsi sicuro se la password è stata cancellata molte volte.

    
risposta data 27.06.2017 - 22:53
fonte

Leggi altre domande sui tag