No, non è possibile invertire una funzione di hash come MD5: dato il valore di hash di output è impossibile trovare il messaggio di input se non si conoscono abbastanza informazioni sul messaggio di input.
La decrittografia non è una funzione definita per una funzione hash; la crittografia e la decrittografia sono funzioni di un codice come AES in modalità CBC; le funzioni hash non crittografano né decodificano . Le funzioni hash sono utilizzate per digerire un messaggio di input. Come suggerisce il nome, non esiste un algoritmo inverso possibile in base alla progettazione .
MD5 è stato progettato come una funzione di hash unidirezionale crittograficamente sicura . Ora è facile generare collisioni per MD5, anche se gran parte del messaggio di input è predeterminato. Quindi MD5 è ufficialmente rotto e MD5 non dovrebbe più essere considerato un hash crittograficamente sicuro. È comunque ancora impossibile trovare un messaggio di input che porti a un valore di hash: trova X quando è noto solo H (X) (e X non ha una struttura pre-calcolata con almeno un blocco di 128 byte di dati precalcolati) . Non sono noti attacchi pre-immagine contro MD5.
In genere è anche possibile indovinare le password usando la forza bruta o gli attacchi (aumentati) del dizionario, confrontare i database o cercare gli hash delle password nelle cosiddette tabelle arcobaleno. Se viene trovata una corrispondenza, è computazionalmente certo che l'input è stato trovato. Le funzioni hash sono anche sicure contro gli attacchi di collisione: trovando X'
così quello H(X') = H(X)
dato H(X)
. Quindi, se X
viene trovato, è computazionalmente sicuro che fosse effettivamente il messaggio di input. Altrimenti dopo tutto avresti eseguito un attacco di collisione. Le tabelle Rainbow possono essere utilizzate per accelerare gli attacchi e ci sono risorse Internet specializzate che ti aiuteranno a trovare una password con un hash specifico.
È ovviamente possibile riutilizzare il valore hashH(X)
per verificare le password generate su altri sistemi. L'unica cosa che il sistema ricevente deve fare è memorizzare il risultato di una funzione deterministica F
che accetta H(X)
come input. Quando X
viene dato al sistema, quindi H(X)
e quindi F
può essere ricalcolato e i risultati possono essere confrontati. In altre parole, non è necessario decrittografare il valore hash per verificare solo che una password sia corretta e puoi comunque memorizzare l'hash come valore diverso.
Invece di MD5 è importante utilizzare un hash password o PBKDF (funzione di derivazione della chiave basata su password). Tale funzione specifica come utilizzare un sale insieme a un hash. In questo modo non verranno generati hash identici per password identiche (da altri utenti o all'interno di altri database). Gli hash delle password per questo motivo, inoltre, non consentono l'utilizzo di tabelle arcobaleno purché il sale sia abbastanza grande e opportunamente randomizzato.
Gli hash delle password contengono anche un fattore di lavoro (a volte configurato utilizzando un conteggio delle iterazioni ) che può rallentare in modo significativo gli attacchi che tentano di trovare la password in base al valore salt e hash. Questo è importante poiché il database con sali e valori di hash potrebbe essere rubato. Infine, l'hash della password può anche essere difficile da memoria, quindi è necessaria una quantità significativa di memoria per calcolare l'hash. Ciò rende impossibile utilizzare hardware speciale (GPU, ASIC, FPGA ecc.) Per consentire a un utente malintenzionato di accelerare la ricerca. Altri input o opzioni di configurazione come un peperone o la quantità di parallelizzazione possono anche essere disponibili per un hash della password.
Permetterà comunque a chiunque di verificare una password fornita H(X)
anche se H(X)
è un hash della password. Gli hash delle password sono ancora deterministici, quindi se qualcuno conosce tutti gli input e l'algoritmo di hash stesso, allora X
può essere usato per calcolare H(X)
e - ancora - i risultati possono essere confrontati.
Gli hash delle password comunemente usati sono bcrypt , scrypt e PBKDF2 . C'è anche Argon2 in varie forme, che è il vincitore della recente competizione di hashing password. Qui su CrackStation c'è un buon post sul blog sulla sicurezza delle password.
È possibile rendere impossibile agli avversari di eseguire il calcolo dell'hash verificare che una password sia corretta. Per questo un pepe può essere usato come input per l'hash della password. In alternativa, il valore di hash può ovviamente essere crittografato utilizzando un codice come AES e una modalità operativa come CBC o GCM. Ciò richiede tuttavia la memorizzazione di una chiave / segreto in modo indipendente e con requisiti di accesso più elevati rispetto all'hash della password.