Per mantenere le password più sicure possibili, anche se il tuo server è compreso (anche se uno degli amministratori agisce come un utente malintenzionato), usa un protocollo che non trasferisca la password dell'utente e che nemmeno trasferisce un hash del password al tempo di autenticazione dell'utente.
Ciò è possibile con il protocollo SRP (Secure Remote Password):
link
Con questo protocollo SRP, uno scambio di 2 numeri casuali (1 inviato dall'utente al server e 1 inviato dal server all'utente) è sufficiente per autenticare l'utente (come proprietario della password) e stabilire un canale sicuro (come fa SSL / TLS). Naturalmente questi 2 numeri casuali contengono alcune informazioni di autenticazione, ma questa informazione è mescolata con numeri casuali in modo tale che, per un contagocce, i 2 numeri scambiati sono proprio precisamente 2 numeri casuali. Vedi RFC 2945 o il documento originale di Tom Wu e l'aggiornamento SRP-6 di Tom Wu.
Non è necessario che un hash ("verificatore") venga trasferito una volta, al momento dell'impostazione della password, per poter essere memorizzato sul server. (Potrebbe naturalmente diventare il bersaglio di un attacco di forza bruta). Dopodiché, solo i numeri casuali vengono scambiati per l'autenticazione, rivelando nulla di più sulla password dell'utente (e impedendo un attacco di riproduzione).