it-swarm-eu.dev

Differenza tra l'hashing di una password e la crittografia

L'attuale votato per primo a questa domanda afferma:

Un altro che non è tanto un problema di sicurezza, sebbene sia legato alla sicurezza, è completo e abietta l'errore di individuare la differenza tra hashing di una password e 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?

124
Claudiu

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 un Rainbow table , che puoi contrastare applicando un salt all'hash prima di memorizzarlo.

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.

201
Vinko Vrsalovic

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 il pre-hash di ogni parola in un dizionario (o di 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.

31
Bill the Lizard

Encrypted vs Hashed Passwords

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 Crittografato vs Hashed Passwords - Quale è meglio?

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 dall'applicazione, sarà in grado di visualizzare tutte le password degli utenti memorizzate nel 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 una parola convertita, ma l'operazione inversa (generazione di password dalla 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?

12
lkamal

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
CheGueVerra

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 più grandi.

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.

hashing :

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

Encryption

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'hash con sale adeguato e sicurezza aggiuntiva con PBKDF2.

Se vuoi dare un'occhiata a come dovresti scrivere le tue funzioni di 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 Algorithm (SHA1) di sicurezza 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.

3
Rahul Garg

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
LogicMagic

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.

1
Peter Coulton