Elaborando le funzioni servono entrambi:
Hashing è, come hai detto, non reversibile. È anche costante. Questo è il motivo per cui lo usiamo per memorizzare le password. Quando si imposta la password per, ad esempio, la propria e-mail, il server non la memorizza mai (beh, alcuni lo fanno, ma meritano un certo grado di vergogna pubblica). Invece, (assumendo che la tua password sia "password") memorizzano h ("password") . Ora diciamo che vuoi accedere. Qui entra in gioco la crittografia . Tu e il server andate anche se qualcosa chiamato scambio di chiavi Diffie-Helfman, che consente di scambiare una chiave con il server. Ora si utilizza quella chiave per crittografare la password ( x = e ("password") ) e inviarla al server. Il server, dal momento che ha la stessa chiave che hai usato per crittografare la tua password, può eseguire la funzione e ^ -1 (x) . Ora ha il testo in chiaro della tua password. Se stessimo parlando di Heartbleed, questo è il punto più probabile per il furto della tua password. Ad ogni modo, ora il server esegue la funzione h ("password") e la confronta con l'hash della password memorizzata che ha associato al tuo nome utente. Se l'hash generato dal valore che hai inviato corrisponde a quello che hanno, ti consentono di accedere al tuo account.