TLS utilizza una chiave pubblica e privata per crittografare una sessione. I client hanno solo il certificato contenente la chiave pubblica, ma per poterlo utilizzare, il server contiene la chiave privata. Al di fuori del server, questa comunicazione è sicura. All'interno del server, un utente malintenzionato può apprendere la chiave e decrittografare le comunicazioni.
Se utilizziamo la crittografia a chiave pubblica / privata per crittografare una password e un utente malintenzionato accede al server, possono apprendere la chiave privata e quindi decrittografare tutte le password.
L'hashing non ha una chiave (anche se può usare "salt".) Spesso viene chiamata una funzione a senso unico, quindi a differenza della crittografia non ha algoritmo "inverso". Se si cancellano i dati, non è possibile annullarli facilmente. Puoi ancora attaccare alla forza bruta un hash provando tutte le password che ti vengono in mente, e se gli hash corrispondono, hai indovinato. Ma non esiste un valore magico che recuperi tutte le password. Ecco perché l'hashing memorizza le password in modo più sicuro rispetto alla crittografia.
Per quanto riguarda i difetti in MD5, SHA-1, ecc., ricorda che ci sono diversi usi per le funzioni hash crittografiche e che le vulnerabilità che ciascuna espone differiscono in base al caso d'uso. Un uso per un hash è generare un digest di messaggi, che è un numero univoco che aiuta a convalidare una parte di testo non modificata (come i dati contenuti in un certificato). Se un secondo documento può essere falsificato con lo stesso valore di digest, quindi un utente malintenzionato potrebbe creare un certificato falso ed eseguire un attacco man-in-the-middle su tutti gli utenti del server. Ma se si trova una collisione tra due password in un database, rischia di perdere solo l'informazione che sia Ulkoma che JohnDeters hanno scelto la stessa password. Ciò comporta rischi per due sole persone invece che per ogni utente del sistema, che nel complesso è un problema meno grave.
La proposta di generare una chiave pubblica univoca per ogni utente (scartando la chiave privata), quindi crittografare e memorizzare la password, produce un sistema funzionalmente equivalente all'utilizzo di un hash salato. L'hacker non deve crackare la chiave pubblica, devono solo provare a crittografare un gruppo di password con la chiave pubblica fino a quando non ottengono una corrispondenza.