Differenza tra l'hashing di una password e la crittografia


140

L'attuale votata per primo a questa domanda afferma:

Un altro che non è tanto un problema di sicurezza, anche se è legato alla sicurezza, è completo e si oppone all'incapacità di colmare la differenza tra l'hashing di una password e la sua crittografia . Più comunemente trovato nel codice in cui il programmatore sta cercando di fornire funzionalità "Ricordami la mia password" non sicura.

Qual è esattamente questa differenza? Ho sempre avuto l'impressione che l'hashing fosse una forma di crittografia. Qual è la funzionalità non sicura a cui fa riferimento il poster?


Un articolo ben scritto sul perché non dovresti semplicemente cancellarti segreti / password. Usa invece HMAC. benlog.com/articles/2008/06/19/dont-hash-secrets
Jay Kumar

Eccellente riassunto dell'argomento sul blog sulla sicurezza di StackExchange: security.blogoverflow.com/2011/11/…
David J. Liszewski,

@JayKumar: l'articolo che hai collegato è molto fuorviante. Combina i sali delle password (che dovrebbero essere visibili agli aggressori) con le chiavi MAC (che dovrebbero rimanere segrete). Il link di David J. Liszewski fornisce una descrizione molto più accurata.
Rufflewind,

Risposte:


222

L'hashing è una funzione a senso unico (beh, una mappatura). È irreversibile, si applica l'algoritmo di hash sicuro e non è possibile recuperare la stringa originale. Il massimo che puoi fare è generare quella che viene chiamata "una collisione", cioè trovare una stringa diversa che fornisce lo stesso hash. Gli algoritmi di hash crittograficamente sicuri sono progettati per prevenire il verificarsi di collisioni. Puoi attaccare un hash sicuro usando una tabella arcobaleno , che puoi contrastare applicando un sale all'hash prima di riporlo.

La crittografia è una funzione corretta (bidirezionale). È reversibile, puoi decrittografare la stringa alterata per ottenere la stringa originale se hai la chiave.

La funzionalità non sicura a cui si riferisce è che se si crittografano le password, l'applicazione ha la chiave memorizzata da qualche parte e un utente malintenzionato che ottiene l'accesso al database (e / o al codice) può ottenere le password originali ottenendo sia la chiave che il testo crittografato , mentre con un hash è impossibile.

La gente di solito dice che se un cracker possiede il tuo database o il tuo codice non ha bisogno di una password, quindi la differenza è discutibile. Questo è ingenuo, perché hai ancora il dovere di proteggere le password dei tuoi utenti, principalmente perché la maggior parte di loro usa sempre la stessa password, esponendole a un rischio maggiore perdendo le loro password.


1
Per essere chiari, ottenere la sicurezza desiderata con l'hash, deve essere un algoritmo hash crittograficamente sicuro con la proprietà specifica che non solo l'hash non è reversibile MA ANCHE dal punto di vista computazionale per generare QUALSIASI altra stringa che genera lo stesso hash.
Tall Jeff,

11
Sì e no ... Le collisioni di hash devono essere difficili da generare per motivi di sicurezza della propria applicazione, ma la non reversibilità è sufficiente per evitare la perdita di password.
Dave Sherohman,

5
setoso: e come recupererai esattamente la password originale dalla tua pessima funzione hash? Ti suggerisco di rileggere il commento di Dave
Vinko Vrsalovic,

1
Semmai, una funzione hash che ha un gran numero di collisioni è migliore per la sicurezza delle password, tuttavia significherebbe ovviamente che potrebbero essere utilizzate più password per accedere all'account.
williamvicary,

1
@ n00b i salt non possono essere codificati perché ogni elemento con hash dovrebbe usare un sale separato. Il punto è che sia UserA che UserB usano la password "1234" se scopri la password di UserA non puoi dire che UserB ha usato la stessa password perché avevano sali diversi. Non è fondamentale per la sicurezza che un sale sia tenuto segreto, la maggior parte delle implementazioni concatena semplicemente il sale sul fronte o sul retro del BLOB binario che rappresenta l'hash.
Scott Chamberlain,

34

L'hash è una funzione a senso unico, il che significa che una volta che si ha una password con hash è molto difficile recuperare la password originale dall'hash. La crittografia è una funzione a due vie, in cui è molto più semplice recuperare il testo originale dal testo crittografato.

L'hashish semplice viene facilmente sconfitto utilizzando un attacco del dizionario, in cui un utente malintenzionato esegue semplicemente l'anteprima di ogni parola in un dizionario (o ogni combinazione di caratteri fino a una certa lunghezza), quindi utilizza questo nuovo dizionario per cercare le password con hash. L'uso di un unico salt casuale per ogni password con hash memorizzata rende molto più difficile per un utente malintenzionato utilizzare questo metodo. Avrebbero sostanzialmente bisogno di creare un nuovo dizionario unico per ogni valore salato che usi, rallentando terribilmente il loro attacco.

Non è sicuro archiviare le password utilizzando un algoritmo di crittografia perché se è più facile per l'utente o l'amministratore recuperare la password originale dal testo crittografato, è anche più facile per un utente malintenzionato fare lo stesso.


13

Password criptate vs hash

Come mostrato nell'immagine sopra, se la password è crittografata è sempre un segreto nascosto in cui qualcuno può estrarre la password in chiaro. Tuttavia, quando la password è sottoposta a hash, sei rilassato in quanto non esiste quasi alcun metodo per recuperare la password dal valore hash.


Estratto da password crittografate o con hash - Qual è la migliore?

La crittografia è buona?

Le password in testo normale possono essere crittografate utilizzando algoritmi di crittografia simmetrici come DES, AES o con qualsiasi altro algoritmo e archiviate all'interno del database. All'autenticazione (confermando l'identità con nome utente e password), l'applicazione decodificherà la password crittografata memorizzata nel database e confronterà con la password fornita dall'utente per l'uguaglianza. In questo tipo di approccio alla gestione delle password, anche se qualcuno ha accesso alle tabelle del database, le password non saranno semplicemente riutilizzabili. Tuttavia, anche in questo approccio vi sono cattive notizie. Se in qualche modo qualcuno ottiene l'algoritmo crittografico insieme alla chiave utilizzata dalla tua applicazione, sarà in grado di visualizzare tutte le password dell'utente memorizzate nel tuo database mediante decrittografia. "Questa è la migliore opzione che ho avuto", uno sviluppatore di software potrebbe urlare, ma esiste un modo migliore?

Funzione hash crittografica (solo andata)

Sì, c'è, forse hai perso il punto qui. Hai notato che non è necessario decifrare e confrontare? Se esiste un approccio di conversione unidirezionale in cui la password può essere convertita in qualche parola convertita, ma l'operazione inversa (generazione di password da parola convertita) è impossibile. Ora, anche se qualcuno ottiene l'accesso al database, non è possibile riprodurre o estrarre le password utilizzando le parole convertite. In questo approccio, difficilmente ci sarà qualcuno che possa conoscere le password top secret degli utenti; e questo proteggerà gli utenti utilizzando la stessa password su più applicazioni. Quali algoritmi possono essere utilizzati per questo approccio?


Ok, ma quando accedi a un servizio, la tua password viene inviata in chiaro / crittografata, perché se viene inviata come hash al server per essere confrontata. un hacker potrebbe, se conosce l'hash, semplicemente inviare l'hash al server per accedere. Questo è il motivo per cui le password per il confronto devono essere inviate crittografate al server, dove vengono decrittografate e con hash. Questo è sicuro vero? Finché le password non vengono mai archiviate in forma non cancellata a lungo termine e tutte le occorrenze di password crittografate / in chiaro vengono cancellate da qualsiasi memoria quando non sono più necessarie?
Agente M

8

Ho sempre pensato che la crittografia può essere convertita in entrambi i modi, in modo che il valore finale possa portarti al valore originale e con l'hashing non sarai in grado di tornare dal risultato finale al valore originale.


8

Gli algoritmi di hash sono di solito di natura crittografica, ma la differenza principale è che la crittografia è reversibile attraverso la decrittazione e l'hash no.

Una funzione di crittografia in genere accetta input e produce output crittografati di dimensioni uguali o leggermente maggiori.

Una funzione di hashing accetta input e produce output in genere più piccoli, in genere anche di dimensioni fisse.

Sebbene non sia possibile ottenere un risultato con hash e "cancellarlo" per ripristinare l'input originale, in genere puoi forzare bruscamente la tua strada verso qualcosa che produce lo stesso hash.

In altre parole, se uno schema di autenticazione prende una password, l'hash e la confronta con una versione con hash della password richiesta, potrebbe non essere necessario che tu conosca effettivamente la password originale, solo il suo hash, e puoi forzare la forza la tua strada verso qualcosa che corrisponderà, anche se si tratta di una password diversa.

Le funzioni di hashing vengono in genere create per ridurre al minimo la possibilità di collisioni e rendere difficile il calcolo di qualcosa che produrrà lo stesso hash di qualcos'altro.


4

Idealmente dovresti fare entrambe le cose.

Per prima cosa hash la password di passaggio per la sicurezza a senso unico. Usa un sale per maggiore sicurezza.

Quindi crittografare l'hash per difendersi dagli attacchi del dizionario se il database degli hash delle password è compromesso.


3
Crittografarlo con cosa? Se ti hanno spinto così tanto da arrivare al database con tutte le password dell'utente (con hash, crittografato o altro), non sarebbero in grado di trovare la chiave per decrittografarle?
Luc,

5
Questo non dovrebbe essere sottoposto a downgrade. È una possibilità che non dovrebbe essere esclusa così facilmente, che il database è compromesso mentre l'applicazione non lo è. Pertanto la crittografia dell'hash è un ulteriore livello di sicurezza.
Arie,

@Luc non sono d'accordo con te, il mio io precedente. Ho visto troppe iniezioni di SQL che non hanno compromesso il codice dell'applicazione (o i file di configurazione) e ora sono dell'opinione che l' aggiunta di un segreto sia utile, sia sotto forma di crittografia che sotto forma di pepe, ma non deve sostituire l' hash. Per una risposta più completa, vedere qui: security.stackexchange.com/a/31846/10863
Luc

3

Hashing :

È un algoritmo unidirezionale e una volta l'hash non può eseguire il rollback e questo è il suo punto debole contro la crittografia.

crittografia

Se eseguiamo la crittografia, ci sarà una chiave per farlo. Se questa chiave sarà trapelata, tutte le tue password potrebbero essere facilmente decifrate.

D'altra parte, anche se il tuo database verrà violato o l'amministratore del tuo server prendesse i dati dal DB e tu avessi usato password con hash, l'hacker non sarà in grado di infrangere queste password con hash. Questo sarebbe praticamente impossibile se usiamo l'hashing con sale adeguato e sicurezza aggiuntiva con PBKDF2.

Se vuoi dare un'occhiata a come dovresti scrivere le tue funzioni hash, puoi visitare qui .

Esistono molti algoritmi per eseguire l'hash.

  1. MD5 : utilizza la funzione hash Message Digest Algorithm 5 (MD5). L'hash di output è lungo 128 bit. L'algoritmo MD5 è stato progettato da Ron Rivest nei primi anni '90 e non è un'opzione preferita oggi.

  2. SHA1 - Utilizza l'hash Security Hash Algorithm (SHA1) pubblicato nel 1995. L'hash di output ha una lunghezza di 160 bit. Sebbene sia ampiamente utilizzato, questa non è un'opzione preferita oggi.

  3. HMACSHA256 , HMACSHA384 , HMACSHA512 - Utilizzare le funzioni SHA-256, SHA-384 e SHA-512 della famiglia SHA-2. SHA-2 è stato pubblicato nel 2001. Le lunghezze degli hash di output sono rispettivamente 256, 384 e 512 bit, come indicano i nomi delle funzioni hash.


1

Per quanto corrette possano essere le altre risposte, nel contesto in cui si trovava la citazione, l'hash è uno strumento che può essere utilizzato per proteggere le informazioni, la crittografia è un processo che prende informazioni e rende molto difficile la lettura / l'uso di persone non autorizzate.


-9

Ecco un motivo per cui potresti voler utilizzare uno sopra l'altro: il recupero della password.

Se memorizzi solo un hash della password di un utente, non puoi offrire una funzione "password dimenticata".


16
Ovviamente non hai letto abbastanza bene la risposta accettata. Leggi attentamente: non dovresti offrire una funzione di recupero della password . Stai suppone di offrire una password di ripristino funzionalità. Ho amministrato molti siti Web per anni, tra cui vBulletin, phpBB, e107, IPB, blogspot e persino il mio CMS personalizzato. Come amministratore non devi MAI MAI avere la password pre-hash di qualcuno. Semplicemente no. E non dovresti averlo neanche tu. Se non sei d'accordo con quello che sto dicendo, ti assicuro: ti sbagli.
Lakey,

3
Scusami se sei troppo arrabbiato. Vedo solo troppi siti Web che memorizzano le password in chiaro e questo mi frustra. Come nota a margine: ad alcuni siti Web orientati alla sicurezza piace far cambiare periodicamente le password agli utenti. Vogliono assicurarsi che la persona non cambi la sua password da "Password1" a "Password2". Pertanto mantengono la password in chiaro per poter fare questi confronti in un secondo momento. Questa non è una buona pratica. Quello che devono fare, in quel caso, è eseguire PRIMA analisi sulla password, creando un gruppo di password simili - ognuna con hash - e archiviando solo gli hash .
Lakey,

7
Nessun problema, mi ha fatto tornare indietro e rileggere la domanda e anche fare ulteriori ricerche, quindi non tutto è perduto :-) Non sono sicuro di cosa stavo pensando quando ho scritto quella risposta. salute
Philtron,
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.