Come si può combinare l'archiviazione delle password salate e hash con un'identificazione basata su testo in chiaro, nonce e hash?

8

La mia comprensione è la seguente:

  1. 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.

  2. 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?

    
posta Tim 12.07.2013 - 18:21
fonte

3 risposte

1

Sì, questo è possibile. Esistono due algoritmi descritti qui che evitano entrambi la necessità di archiviare gli equivalenti in testo normale sul server (rendendo possibile l'autenticazione senza la necessità di inviare password in chiaro sul filo).

    
risposta data 13.07.2013 - 00:20
fonte
3

Dai un'occhiata al protocollo Secure Remote Password ( wikipedia , Stanford ). Usa un hash della password (scegli il tuo hash lento e salato preferito) sul lato client, ma il server riceve solo un "verificatore" derivato da che hash per esponenziazione discreta. L'autenticazione effettiva avviene tramite uno scambio di chiavi asimmetrico utilizzando due numeri casuali (uno generato dal client, uno generato dal server), l'hash (solo lato client) e il verificatore (lato server). È inteso che la chiave generata sia utilizzata per crittografare il resto della sessione, ma potrebbe semplicemente essere verificata e scartata.

I vantaggi:

  • Lo scambio di chiavi in sé è effettivamente una prova a conoscenza zero, il che significa che un ascoltatore, man-in-the-middle o server impostor non ottiene informazioni sulla password. Se questi fossero gli unici tipi di attacco possibili, una password a singola lettera sarebbe sufficiente per la sicurezza.
  • Un attacco del dizionario online (impostore del client) può testare solo una password per tentativo (le prime versioni del protocollo ne consentivano due).
  • Se un utente malintenzionato copia il database dei verificatori del server, può eseguire un attacco di dizionario offline solo eseguendo ciascuna password candidato attraverso l'esponenziazione lenta hash e . Non possono usare il verificatore per impersonare il cliente.
  • Finché il verificatore del server rimane segreto, la transazione di scambio verifica in modo efficace il server per il client (e anche il client per il server).
risposta data 14.07.2013 - 19:32
fonte
0

Correggimi se ho torto ma, potresti mantenere la password con hash sul server. quindi è conservato in modo sicuro. e usa il nonce come sale per l'autenticazione. Una cosa importante che vedo è che il server non ha bisogno di conoscere la password in questo modo. Può ancora provare che la persona ha inserito la password corretta alla fine, ma confrontando gli hash, non il testo in chiaro. L'unico posto in cui questa password sarebbe in chiaro nel mio scenario sarebbe la finestra web broswer prima che venisse cancellata (due volte, una volta sola e una volta con sale noto) e poi inviata sul filo non in testo semplice

Considera lo scenario seguente

  1. Il client tenta di connettersi
  2. Il server genera nonce
  3. Il server invia nonce al client. Rinnova l'hash con nonce come sale. un hash che accetta l'hash della password come input e il nonce come salt.
  4. Il client esegue il hashing tramite lo stesso algoritmo di hash, generando lo stesso hash che viene memorizzato sul server.
  5. Il client quindi esegue il proprio hash individuale allo stesso modo del server (un hash dell'hash del pwd con nonce come salt)
  6. Il client trasmette l'hash non crittografato al server.
  7. Il server lo accetta come corretto per quell'unica ora di autenticazione e non accetterà più lo stesso hash non forzato
risposta data 12.07.2013 - 20:02
fonte

Leggi altre domande sui tag