2009-09-04 5 views
25

Se si dovesse eseguire una hash di una password utente prima di inviarlo attraverso la linea e di lasciarlo in testo normale in memoria, ciò migliorerebbe la sicurezza dell'applicazione?Ha senso di sicurezza per hash password sul client fine

Suppongo che questo riduca una piccola parte delle vulnerabilità proteggendo i dati memorizzati nella memoria del client. Ma se davvero siamo preoccupati per qualcuno che sta leggendo la memoria del cliente ci sono probabilmente problemi più grandi che non possiamo affrontare.

C'è qualcosa che non sembra giusto per l'hashing sulla parte client.

L'hashing della password sul client è una pratica comune? Ci sono altri vantaggi o svantaggi nel farlo?

MODIFICA: Dato il canale di comunicazione è sicuro (SSL). In quali condizioni sarebbe accettabile e utile utilizzare un simile approccio. Lo sto chiedendo perché è stato suggerito da un "professionista della sicurezza" che utilizzo questo schema durante alcune funzioni applicative.

+3

La risposta accettata è errata. ** Ti dà un vantaggio, ** a patto che tu abbia saltato l'hash stesso anche dal lato server. Vedi http://security.stackexchange.com/a/23285/2379, http://security.stackexchange.com/a/23033/2379 – Pacerier

risposta

20

No.

Quando il client invia qualcosa, se si tratta di P o H(P) o H(H(P)) chi intercetta questo può semplicemente inviare nuovamente la stessa identica cosa, rendendo così qualsiasi funzione come questo equivale a utilizzare il password direttamente

Ecco perché è necessario utilizzare un nonce; Il server può fornire alcuni rifiuti casuali k e il client calcolerà H(P,k) e lo invierà al server. HMAC è un'implementazione popolare di questo metodo.

Se il server mai accetta lo stesso nonce due volte, questo è sicuro contro un attacco di riproduzione.

+12

... ma ciò crea un'opportunità DoS: cattura ogni server nonce che viene inviato al client e lo utilizza prima che il client legittimo possa; voilà, ora il client non può accedere, poiché ogni nonce è già scaduto dal momento in cui il client invia la sua richiesta. Non è uno scenario del tutto pratico, ma come sempre, la sicurezza deve essere in equilibrio con l'usabilità, ea volte aggiungerne una riduce l'altra. – Piskvor

+5

Come altre risposte sottolineano, ci sono alcuni * leggeri * vantaggi per l'hashing sul client poiché molti utenti riutilizzano le password con più servizi. – pettys

+0

@pettys: No, non ci sono. Ci sono vantaggi nel fare la crittografia o un hash protetto da mac, ma non ci sono vantaggi nel fare un hash non salato e non protetto sul client. – geocar

4

Accertati solo di inviare la password tramite un canale protetto (SSL). Se il client può leggere una memoria privata dell'applicazione, molto probabilmente hanno problemi più grandi, come ad esempio un keylogger.

14

L'hash è identico alla password di un POV di sicurezza nello scenario che descrivi: se intercetto l'hash, non ho bisogno di conoscere la password, posso semplicemente inviare al server l'hash che ho intercettato.

Authentication protocols andare un po 'per evitare questo problema; la sicurezza è difficile, e la scelta migliore e l'implementazione di un protocollo ben compreso piuttosto che la rotazione sono le migliori.

Se il traffico sta andando oltre SSL, sei al sicuro dall'intercettazione e l'hashing ti dà un piccolo vantaggio in più.

+12

L'unico modo in cui non è equivalente è la password dell'utente, che può utilizzare per più account - non è nella natura. –

+1

@LucasOman Spiacente, ma un singolo hash di base non fa nulla per proteggere una password e fornisce un falso senso di sicurezza. Strumenti come hashcat possono eseguire miliardi di hash di base al secondo sull'hardware di base. L'unico modo per fornire protezione con un hash client è eseguire un BCrypt/PBKDF2 completo con decine o centinaia di migliaia di iterazioni, come facciamo per memorizzare le password sul server. È sciocco perché l'hash risultante è ancora la password per quanto riguarda il server. Basta usare SSL. – Tito

+1

@Tito "un singolo hash di base non fa nulla per proteggere una password" Questa è una palese menzogna. Hashcat sta facendo un attacco di forza bruta, il che significa che se la password è di una lunghezza qualsiasi l'attaccante non sarà in grado di indovinarlo. Pertanto, se viene utilizzata la stessa password lunga in più servizi, un utente malintenzionato con solo l'hash può utilizzarlo solo sul servizio che accetta tale hash. E se ogni sito che utilizzava lo stesso algoritmo di hashing, ma un nonce diverso, specifico del fornitore, allora si poteva virtualmente garantire che l'hash sarebbe stato utile solo su un sito. –

12

L'invio di una password hash non migliorerà la sicurezza del tuo sito, come altri hanno fatto notare (da quando si accetta una password hash, tutto il cattivo ha bisogno di sapere è la versione hash). Inoltre non è molto sicuro, dal momento che il cattivo può caricare presumibilmente la tua pagina di accesso ed esaminare il javascript o Java distribuito.

Ciò che fa è impedire a qualcuno che guarda i pacchetti di essere in grado di estrarre una password, e che è moderatamente utile. Molte persone usano la stessa password su più siti (lo faccio per tutti tranne i siti con maggiore sicurezza), e quindi se riesci a ottenere una password da loro puoi accedere ad altri account su altri siti.

Impedisce inoltre che la password reale venga archiviata, anche temporaneamente, sul tuo sito e ciò potrebbe fornire un po 'di sicurezza in più se il tuo sito è compromesso.

Quindi, anche se considererei l'hashing lato utente potenzialmente una buona cosa, non vale la pena andare a molti altri problemi.

E, come altri hanno già detto, non tirare la propria sicurezza. Ci sono troppe cose che possono andare storte. Non li noterai quasi alla stessa velocità di un ragazzo cattivo praticato.

+0

'Inoltre non è molto sicuro, dal momento che il cattivo può caricare presumibilmente la pagina di accesso ed esaminare il Javascript o Java implementato. Una buona sicurezza non dovrebbe dipendere dall'attaccante che non conosce il tuo algoritmo, quindi questo punto è spurio, è la chiave che stai cercando di rendere più difficile da determinare, non dall'algoritmo. codice che implementa SSL. Non significa il l'utente malintenzionato può rompere SSL. –

5

No, l'hashing sul client non protegge la password 'completamente'. Quando si sceglie di cancellare la password sul client, il digest inviato al server diventa essenzialmente la password. Questo non è un problema di per sé se SSL è distribuito.

Tuttavia, questo schema finisce per creare più problemi di quanti ne risolva. Se il server dovesse confrontare l'hash inviato dal client con un hash memorizzato nel database senza eseguire ulteriori operazioni crittografiche (in particolare l'hashing dei dati di input), quindi la password viene memorizzata in chiaro per tutti gli scopi pratici. Chiunque abbia accesso all'hash memorizzato può inviarlo di nuovo al server e accedere agli account.

In termini semplici, se l'hash inviato (che è lo stesso dell'hash inviato) dovesse filtrare tramite qualsiasi altra vulnerabilità all'interno dell'applicazione (tramite SQL injection, ad esempio), l'applicazione ha una vulnerabilità in cui protegge le password inadeguatamente.

Se la vulnerabilità sottostante deve essere fissato, allora è necessario trattare l'hash presentata come una password in chiaro, che andrà poi hash (con un sale, preferibilmente) prima del confronto con un hash memorizzato.

+2

'L'hashing del client non protegge la password 'completamente'' Beh, niente protegge la password _completamente_. Se il tuo aggressore è disposto a uccidere un bambino ogni minuto finché non lo fai pubblicare sul tuo blog wordpress, supponiamo che alla fine lascerai che caricino tutte quelle foto di gatti. Il punto è che protegge la password _more_, a cui apparentemente la tua risposta è "no". 'la password è memorizzata in chiaro per tutti gli scopi pratici. No, non lo è. Il ** token di autenticazione ** è in chiaro, ma la ** password ** è nascosta. –

+0

So che la distinzione tra token di autenticazione e password potrebbe sembrare pedante, ma se sono qualcuno che usa abitualmente codici di lancio nucleari attivi come password, o sono Rush Limbaugh e la mia password è "Ho ucciso una bambina nel 1993 e questo è la mia ammissione di colpevolezza legalmente vincolante ", la differenza è piuttosto importante. –

-2

L'hash sul lato client apre un altro enorme buco: è possibile esporre l'algoritmo di hashing. Non dici se questo è basato sul web (client = JavaScript) o thick-client, ma stai dando loro più informazioni. Dato che il canale è sicuro, non devi preoccuparti che la password del testo in chiaro venga sniffata.

Inoltre, se l'algoritmo di hashing richiede un sale, si espone il tuo sale, il che significa che se hanno mai avuto accesso al database, sarebbero in grado di decifrare ogni password.

+6

Non vero. 1) La sicurezza non dovrebbe mai fare affidamento sul nascondere l'algoritmo che viene utilizzato. 2) Anche se si conosce il sale, è molto difficile da decrittografare le password (a condizione che siano crittografate usando i metodi standard) a meno che non si abbia una tabella arcobaleno di quel 'sale'. – sojin

+2

Questa risposta sembra fraintendere la funzione di un sale. Se stai usando lo stesso sale per ogni password, allora stai sbagliando e potresti anche non usare affatto un sale. –

11

Sì, dovresti.

IEEE ha avuto una violazione dei dati in cui 100K email e password sono state esposte da un weblog.

http://ieeelog.com/

Ovviamente, IEEE non dovrebbe hanno esposto il loro blog! Ma se avessero cancellato le password dal lato client, questo non sarebbe stato altrettanto grave.

Come afferma la prima risposta, è necessario utilizzare un nonce. Se si utilizza un nonce abbastanza lungo (ad esempio 128 bit), non è necessario preoccuparsi del riutilizzo, in quanto il server non richiederà mai lo stesso nonce due volte (presupponendo un CRNG correttamente seminato, ecc.).

4

Penso che abbia senso in una circostanza; non vuoi nemmeno conoscere la password in chiaro del client. Se si esegue l'hash sul lato client, quindi salt e iterativamente hash che hash nello stesso modo in cui si farebbe un testo normale pw. A parte questo, è piuttosto sciocco.

0

posso darvi diverso tipo di approccio Se non avete SSL si può hash della password sul lato client e di nuovo hash sul lato server utilizzando un altro metodo di hashing e memorizzarli sul database di e quando login utente con password fare lo stesso processo e abbinare la doppia password hash con gli hash memorizzati

+0

Il pericolo lì, e ciò che è menzionato in altri commenti ad altre risposte, è il [replay attack] (http://en.wikipedia.org/wiki/Replay_attack) –

+1

@ George'Griffin - Come è un attacco di replay specificamente rilevante per offuscare o crittografare la trasmissione? Non si applicherebbe anche alla trasmissione in chiaro, tranne che in quel caso, la password precisa potrebbe essere più rapidamente o persino inavvertitamente compromessa? – groovenectar