La mia comprensione è la seguente:
-
Per archiviare in modo sicuro una password (ad esempio in un database), si utilizza un algoritmo di hash progettato per questo scopo (progettato per essere lento, ad esempio bcrypt) e si utilizza un salt unico per ogni password. Ciò rende difficile / lento per un utente malintenzionato accedere al database per recuperare le password, poiché non è possibile utilizzare una tabella arcobaleno e ogni tentativo di forza bruta richiede più tempo rispetto a un semplice md5 o sha1.
-
Per autenticare in modo sicuro una password su un protocollo di testo semplice (cioè non SSL), il server invia al client un nonce, e il client combina la password, e il nonce (e forse anche un timestamp), esegue un algoritmo di hash su di loro e trasmette tale hash al server, che esegue lo stesso algoritmo e confronta. Ciò evita l'invio della password in testo semplice e rende impossibile anche attacchi di riproduzione, a condizione che il server non possa essere ingannato nell'accettare lo stesso nonce due volte.
Il problema è che, per la parte di autenticazione di questo server, è necessario conoscere la password in chiaro in chiaro. Quindi non puoi memorizzarli in modo sicuro come in # 1.
Ora, il server potrebbe trasmettere il sale al client, e il client potrebbe calcolare prima la password salata, cancellata e poi fare # 2. Ma poi la password hash salata diventa effettivamente la password in chiaro, quindi non hai ancora il numero # 1.
Quindi la mia domanda è, c'è un modo per fare sia il # 1 che il # 2?