Domanda:
Sicurezza https: la password deve essere sottoposta ad hashing lato server o lato client?
johndodo
2011-11-02 15:13:11 UTC
view on stackexchange narkive permalink

Sto creando un'applicazione web che richiede agli utenti di effettuare il login. Tutte le comunicazioni passano tramite https. Sto usando bcrypt per l'hash delle password.

Mi trovo di fronte a un dilemma: pensavo fosse più sicuro creare un hash della password lato client (utilizzando JavaScript) e poi confrontarlo con l'hash nel DB lato server. Ma non sono sicuro che sia meglio che inviare una password in testo normale su https e poi l'hashing lato server.

Il mio ragionamento è che se l'attaccante può intercettare il traffico https (= leggere la password in testo normale), ad esempio può anche cambiare JavaScript in modo che invii la password in chiaro insieme a quella con hash, dove può intercettarla.

Il motivo contro l'hashing lato client è solo la facilità d'uso. Se ho hash lato client devo usare due librerie separate per l'hashing. Questo non è un problema insormontabile, ma è un fastidio.

C'è un vantaggio in termini di sicurezza nell'utilizzo dell'hashing lato client? Perché?

Allora dovrei usare anche challenge-response?

AGGIORNAMENTO: ciò che mi interessa di più è questo: queste tecniche (lato client hashing, richiesta-risposta) aggiungono un vantaggio significativo in termini di sicurezza nel caso in cui venga utilizzato https ? In caso affermativo, perché?

http://stackoverflow.com/questions/3715920/about-password-hashing-system-on-client-side
Grazie per il collegamento, ma sebbene la situazione sia simile, c'è una sottile differenza: sto usando https. Inoltre, trovo che la spiegazione delle risposte manchi ... Se la pagina può essere letta, può anche essere modificata, il che significa che l'utente inserirà la sua password in una forma fornita dall'aggressore. Aggiornerò la domanda per sottolinearlo meglio.
Vedi anche http://security.stackexchange.com/q/23006/2379
Personalmente penso che tutti i clienti dovrebbero eseguire il salt e l'hash delle password prima di inviarle.Non vedo alcun motivo per cui darei la mia password in chiaro a un server, quando una versione con hash funzionerebbe altrettanto bene.Sono deluso dal fatto che questa non sia una pratica standard.(E sì, ovviamente, le password dovrebbero essere salate e sottoposte ad hashing anche sul server.)
Seguendo il mio sfogo, ecco qualcuno che fa qualcosa di simile come domanda: [Come autenticarsi in un sito web con chiavi pubbliche / private?] (Http://security.stackexchange.com/questions/100266/how-to-authenticate-in-un-sito-con-chiavi-pubbliche-private)
@joeytwiddle Questo non funziona a meno che il server non fornisca il sale (challenge-response).Date due password con hash con valori salt differenti, non è possibile stabilire se la password originale fosse la stessa.
Hash (almeno) una volta sul client e una volta sul server e con diversi, forniti dal server per ogni utente.In questo modo proteggi anche gli utenti che utilizzano "baseball" per ogni password.
Dieci risposte:
Nicole Calinoiu
2011-11-02 17:11:19 UTC
view on stackexchange narkive permalink

Se si esegue l'hash sul lato client, la password con hash diventa la password effettiva (con l'algoritmo di hashing che non è altro che un mezzo per convertire un mnemonico gestito dall'utente nella password effettiva).

Ciò significa che memorizzerai l'intera password "in testo normale" (l'hash) nel database e avrai perso tutti i vantaggi dell'hashing in primo luogo.

Se decidi di seguire questa strada, potresti anche rinunciare a qualsiasi hashing e semplicemente trasmettere e memorizzare la password grezza dell'utente (che, per inciso, non consiglierei particolarmente).

Puoi spiegare perché pensi che sia così? Per quanto ne so, l'unico vantaggio dell'utilizzo di password con hash è proteggere gli account degli utenti su ** altri ** siti Web nel caso in cui le password / password con hash vengano rubate, nient'altro. Se è così, non dovrebbe esserci alcuna differenza nel punto in cui viene eseguito l'hashing. C'è qualche altro vantaggio nell'hashing che mi sono perso?
La memorizzazione di un hash salato dovrebbe in realtà aiutare a proteggere la tua applicazione da un utente malintenzionato che ottiene le credenziali leggendo il contenuto dell'archivio dati di autenticazione. Se non è in grado di dedurre una password dal negozio, non può passarla al server per l'autenticazione.
Aaaah, ha senso ... L'attaccante ottiene la password con hash, ma non è in grado di usarla su questo sistema perché il sistema l'ha hash da solo, quindi dovrebbe prima trovare la password originale. Ben fatto! :)
Sì, l'hash della password diventa il token di autenticazione, ma se questo può essere intercettato, lo stesso può essere l'identificatore di sessione. Sebbene il secondo consenta solo di abusare della sessione, mentre il primo consente all'autore dell'attacco di aprire nuove sessioni, il vantaggio proposto non è poi così grande e si basa su un attacco MITM alla connessione SSL.
@johndodo "_l'unico vantaggio nell'usare password con hash è proteggere gli account degli utenti su altri siti web nel caso in cui le password / password con hash vengano rubate_" Non solo un motivo. Ma ancora, è una delle ragioni.
Questa risposta non è proprio giusta.Evidenzia la vulnerabilità di un approccio * ingenuo * all'hashing lato client.È certamente vero che se il server non esegue alcun hashing e memorizza solo il valore inviato dal client, ciò non sarebbe meglio che memorizzare le password in chiaro.Ma la soluzione semplice è eseguire l'hash * sia * sul client che sul server.E con questa semplice soluzione in atto otteniamo un vantaggio significativo: il costo dell'hashing delle password ad alta intensità di risorse può essere spostato dal server al client e probabilmente aumentato ulteriormente rispetto a quanto il server potrebbe essere in grado di supportare.
@LuisCasilla No.La prima frase della risposta si applica ancora: l'hashing della password lato client non aggiunge alcuna sicurezza aggiuntiva al sistema.
Inoltre, è meglio controllare tutte le autenticazioni lato server, perché ovviamente è più facile hackerare un client.
La tua prima frase e le tue conclusioni generali sono corrette ma le tue ultime due frasi sono completamente sbagliate.L'hashing lato server è sicuramente la strada da percorrere e l'hashing lato client rende l'hash la password.Tuttavia, se dovessi scegliere tra un sistema che memorizza le password in testo normale o hash lato client, prenderei hash lato client ogni volta.L'hashing lato client almeno protegge ancora la password effettiva, che è l'intero punto dell'hashing - per proteggere l'utente dal riutilizzo della propria password.
Penso che sia per questo che la tua ultima frase mi infastidisce così tanto.Lo scopo dell'hashing non è l'hash per il bene dell'hashing: è fare in modo che se un utente malintenzionato trova i database delle password non può capire quali fossero le password originali, perché poi andrebbero e violerebbero tuttogli altri account con cui l'utente ha utilizzato quella password.Con l'hashing lato client, la protezione è ancora in atto e suggerire che l'hashing lato client è dannoso quanto le password in testo semplice è semplicemente sbagliato.Penso che tu abbia perso la foresta per gli alberi.
@ConorMancone: Sospetto che tu stia deducendo qualcosa dalla mia risposta che non è mai stato inteso.Questa domanda riguarda l'hashing sul client rispetto al server, non sull'evitare l'hashing.La risposta indica che l'archiviazione di password in testo normale è una cattiva idea, ma è stata menzionata come una cosa a parte poiché, al momento della stesura della risposta, avevo assunto che l'OP comprendesse la ragione principale dell'hashing.(Inoltre, vale la pena notare che la protezione dell'utente negli scenari di riutilizzo della password non è _non_ il motivo principale per l'hashing della password.)
@NicoleCalinoiu la tua ultima frase afferma chiaramente che l'hashing lato client è insicuro quanto usare semplicemente password in testo normale.Questo non è vero ed è un pericoloso equivoco.Sebbene complessivamente peggiore dell'hashing lato server, l'hashing lato client protegge comunque la password originale dal recupero e dall'uso per tentare di entrare in altri servizi, il che è un punto debole critico da cui è necessario proteggersi.Pertanto, l'hashing lato client è molto meglio della semplice trasmissione / memorizzazione di password in testo normale, e penso che sia molto più sicuro non implicare il contrario.
@NicoleCalinoiu RE: l'uso principale dell'hashing: non sono assolutamente d'accordo.La protezione dell'utente negli scenari di riutilizzo delle password * è * il motivo principale dell'hashing delle password.Contrariamente al tuo commento all'inizio di questo thread, l'hashing fornisce solo una protezione debole contro gli aggressori che ottengono l'accesso all'account se ottengono l'accesso in lettura a un database (ad esempio).I sistemi possono memorizzare anche i dati della sessione nei database, in modo che dia accesso agli account anche se le password sono sottoposte ad hashing.Inoltre, la crittografia potrebbe essere altrettanto efficace dell'hashing in quello scenario.Abbiamo hash per proteggere dal riutilizzo delle password.
Nessuno di voi ha detto l'altra cosa.l'hashing lato client rende la password MENO SICURA per password complesse.cioè, se avessi una password generata utilizzando tutti i set di caratteri (su / giù / num / simboli) a una lunghezza lunga ma casuale, e l'hai hash, per definizione di hash hai introdotto che anche password diverse (collisioni) possono funzionare, e attaccanteha meno "password possibili" per la forza bruta.
Thomas Pornin
2012-10-28 00:56:52 UTC
view on stackexchange narkive permalink

L'hash sul client ha senso solo se non ci si fida in qualche modo del server e non si vuole mostrare la password "effettiva" (quella che l'utente umano ricorda). Perché non vuoi mostrare la password proprio al sito in cui la suddetta password ha qualche utilità? Perché hai riutilizzato la password altrove! Di solito è male, ma esiste una versione relativamente sicura che si incarna in miriadi di estensioni del browser o bookmarklet come questo o quello (non garantisco la loro qualità). Si tratta di strumenti in cui l'utente umano ricorda una "password principale", da cui viene generata una password specifica del sito, utilizzando il nome di dominio del sito come una sorta di sale, in modo che due siti distinti ottengano password distinte.

Anche se questo scenario ha senso, farlo con Javascript inviato dal server stesso non lo fa. In effetti, lo scopo dell'hashing della password lato client è che il server è potenzialmente ostile (ad es. Sovvertito da un aggressore), e quindi il codice Javascript inviato da quel server è, come minimo, sospetto. Non vuoi inserire la tua preziosa password in qualche Javascript ostile ...


Un altro caso di hashing lato client riguarda l ' hashing lento . Poiché le password sono, per definizione, deboli, vuoi contrastare gli attacchi ai dizionari. Presumi che il malintenzionato abbia una copia del database del server e "proverà le password" sulle sue macchine (vedi questo post del blog per alcune discussioni su questo). Per rallentare l'avversario, utilizzi un processo di hashing intrinsecamente lento (come bcrypt), ma questo rallenterà l'elaborazione per tutti, incluso il server. Per aiutare il server, potresti voler scaricare parte del lavoro sul client, quindi eseguirne almeno una parte in un po 'di codice Javascript in esecuzione nel browser del client ...

Sfortunatamente, Javascript è terribilmente lento in questo tipo di lavoro (in genere da 20 a 100 volte più lento di un codice C decente) e il sistema client non sarà in grado di contribuire in parte sostanziale allo sforzo di hashing. L'idea è valida ma dovrà aspettare una tecnologia migliore (avrebbe funzionato con un client Java , però: con una JVM decente, il codice Java ottimizzato è da 2 a 4 volte più lento del codice C ottimizzato , per un lavoro di hashing).


Per riassumere, non ci sono davvero buoni motivi per eseguire l'hashing delle password lato client, dal codice Javascript inviato dal server stesso. È sufficiente inviare la password "così com'è" al server tramite un tunnel HTTPS (la pagina di accesso, l'URL di destinazione del modulo e qualsiasi pagina sia protetta dalla password devono essere tutte servite tramite SSL, altrimenti hanno problemi di sicurezza più urgenti rispetto all'uso delle password).

rmorero
2011-11-02 15:25:28 UTC
view on stackexchange narkive permalink

Trovo che tutte le tue preoccupazioni siano valide, ma il mio consiglio sarebbe di farlo lato server.

C'è sempre una possibilità abbastanza grande che un utente lasci il proprio terminale sbloccato, consentendo la manipolazione. E anche; se la tua logica di hashing è lato client, la stai esponendo.

Un'altra opzione potrebbe essere quella di generare le password lato server; allora non stai inviando una password in chiaro. Ma avresti comunque bisogno di comunicare la password all'utente. E poiché la maggior parte degli utenti non utilizza ancora la posta elettronica crittografata, la considero meno sicura.

Ho visto soluzioni per inviare password tramite un tunnel crittografato a un cellulare; ma dubito che la sicurezza sia migliore di SSL. Forse qualcuno potrebbe provare / confutare questo?

"_se la tua logica di hashing è lato client, la stai esponendo._" e allora?
Forse non è un grosso problema. Ma preferisco esporre il meno possibile. Supponiamo che tu possa entrare in possesso di un database con password con hash. Se conosci l'algoritmo di hashing, potresti generare un elenco di hash da un elenco di password comuni e abbinarli.
@rmorero: Tendo a non essere d'accordo ... Prima di tutto, non c'è molto che puoi fare per proteggerti dagli utenti che lasciano il terminale sbloccato, a parte [sonar] (http://stevetarzia.com/sonar/) e simili. Inoltre, nascondere l'algoritmo di hashing è sicurezza per oscurità. Devi decidere cosa è segreto e cosa non lo è. Nascondere cose non segrete di solito è controproducente.
@johndodo Vero, questi sono punti validi. E la mia logica sopra dipende in parte da una cattiva implementazione. Tuttavia, direi che la sicurezza per oscurità è controproducente solo se ci si affida; che non consiglio.
@rmorero: il pericolo nella sicurezza per l'oscurità non è tanto affidarsi ad essa ... Per come la vedo io, i tre problemi principali sono: a) ci dedichi il tuo tempo invece che su soluzioni reali, b) potresti commettere un errore e in realtà peggiora la sicurezza, ec) rende il sistema meno trasparente e potrebbe quindi nascondere altri errori. In altre parole, aggiunge "nebbia" - e poiché un abile hacker probabilmente ha fendinebbia nel suo arsenale, preferirei una giornata di sole per affrontarlo. ;)
@johndodo In parte sono d'accordo con te. Per a) In alcuni casi, questo è vero, ma se l'implementazione è la stessa per una soluzione pubblica e nascosta? Per b) Vero. Ma potresti anche commettere lo stesso errore nella tua implementazione pubblica: sarebbe solo più veloce da rilevare? c) Vero, sono anche favorevole alla trasparenza; ma con questa stessa logica consiglieresti anche di eseguire tutto in un sistema su porte standard?
@rmorero "_con questa stessa logica consiglieresti anche di far girare tutto in un sistema su porte standard? _" Non oscurare le cose ** non ** significa che dovresti usare porte standard. L'utilizzo di porte non standard non è solo oscurità.
Samuel
2015-09-18 02:01:03 UTC
view on stackexchange narkive permalink

L'hashing lato server è importante come hanno indicato tutte le altre risposte, ma vorrei aggiungere che l'hashing lato client sarebbe una bella funzionalità di sicurezza oltre all'hashing lato server.

L'hashing lato client presenta vantaggi nei seguenti scenari:

  1. Protegge la password dell'utente quando il server è compromesso. Cioè se il client non è compromesso, ma il server lo è, se il client esegue l'hashing della password, il server potrebbe comunque ottenere l'accesso a un sistema, ma hai protetto la password dell'utente, il che è importante se utilizza quella password altrove.
  2. Protegge la password dell'utente quando l'utente pensa di accedere a un server ma in realtà accede a un altro (errore utente). Ad esempio, se ho due conti bancari e digito accidentalmente una delle password della mia banca nel sito web della banca sbagliata, se la banca ha effettuato l'hashing della password lato client, quella banca non conosceva la password dell'altra banca. Penso che sarebbe una cosa "educata" da fare per eseguire l'hashing lato client in modo che la loro password in testo semplice non venga mai trasmessa via cavo.

Per lo più mostra rispetto per la password dell'utente. L'utente condivide un segreto che potrebbe non essere esclusivo del tuo software, quindi se rispetti quel segreto, dovresti fare tutto quanto in tuo potere per proteggerlo.

Non considererei un vantaggio abilitare / facilitare il riutilizzo delle password.E la password in testo normale non viene mai inviata via cavo indipendentemente dall'uso di HTTPS.
@augurar Non lo chiamerei abilitare o facilitare il riutilizzo della password.Gli utenti sono umani e gli esseri umani fanno cose sconsigliate come il riutilizzo delle password.Lo considero sulla stessa linea dell'impedire all'utente di scegliere una password debole.L'hashing della password lato client compensa il fatto che molti dei tuoi utenti useranno sul tuo sito la stessa password delle loro banche.Per quanto riguarda la tua seconda dichiarazione, se il server è compromesso, possono vedere la richiesta HTTP decrittografata e la password in chiaro.
+1 al secondo, l'hashing lato client è l'unico modo per dimostrare che non stai coltivando password.https://xkcd.com/792/
bua
2011-11-02 15:19:43 UTC
view on stackexchange narkive permalink

Se ti trovi in ​​un tunnel HTTPS, la password o l'hash devono essere protetti dalla sorveglianza Ethernet.

Sul lato client forse potresti salare l'hash con un ID di sessione.
Questo potrebbe essere più difficile da simulare per Javascript dannoso.

Vale la pena notare che i salts fixed + challenge con hashing lato client possono essere utilizzati per implementare un meccanismo di password sicuro su connessioni non crittografate (ma ovviamente il token di sessione e altri scambi successivi non sono sicuri)
@symcbean Cosa intendi per "sicuro"?
Voglio dire che il meccanismo di trasmissione della password non è soggetto a intercettazioni.
bua, grazie
@kwolbert continui a postare commenti come nuove risposte invece di commenti. Per favore, alleghi questo come commento dove intendi che sia letto nel contesto e quindi cancelli la risposta qui? Grazie.
@kwolbert Benvenuto nella sicurezza IT! Utilizza il pulsante * Pubblica risposta * solo per le risposte effettive. È necessario modificare la domanda originale per aggiungere ulteriori informazioni.
Anonymous
2017-01-21 01:47:38 UTC
view on stackexchange narkive permalink

L'hashing della password lato client richiederà Javascript. Alcune persone disabilitano Javascript sul proprio browser. Devi gestire questo scenario.

Ho visto software per forum che esegue l'hashing della password lato client e invia l'hash all'accesso se possibile , altrimenti la password viene inviata in chiaro testo. Quindi funziona in entrambe le situazioni.

L'invio della password in chiaro non è una delle principali preoccupazioni se si utilizza https. Idealmente il tuo server dovrebbe quindi rifiutarsi di servire pagine in http in modo da evitare attacchi man in the middle. Il ragionamento è: un utente malintenzionato potrebbe forzatamente "eseguire il downgrade" della tua connessione da https a http e avviare lo sniffing del traffico (ad esempio con uno strumento come SSL Strip).

"* Devi gestire questo scenario *" ... se vuoi mantenere quegli utenti.È l'1% delle persone e penso che il 90% di loro possa essere convinto ad attivarlo se il tuo sito web non è pieno di merda.
Ini
2017-08-15 04:04:31 UTC
view on stackexchange narkive permalink

La risposta accettata di @Nicole Calinoiu è ovviamente corretta ma forse troppo difficile da capire all'inizio.

Il punto è la password dovrebbe essere sottoposto ad hashing sul server in modo che il malintenzionato non possa utilizzare gli hash che ha violato dal database dal server per ottenere l'accesso al tuo account o ai tuoi dati.

Come già detto, se hai l'hash sul lato client e il back-end lo supporta, l'hash diventa la tua password e se l'hash viene rubato tramite un hack, l'hacker ha la password.

La risposta di @Thomas Pornin ha anche trovato un ottimo punto sul motivo per cui dovresti voler hash la password sul client, ma la cosa che descrive in la sua prima storia può essere fatta solo se il back-end del server supporta la gestione delle password con hash (cioè non eseguire l'hashing della password se è già hash, ma che qualcuno cerchi di supportare qualcosa del genere è altamente improbabile), il che la maggior parte delle il tempo non sarà il caso immagino. La seconda storia di lui è molto buona.

nat that
2020-01-14 01:47:01 UTC
view on stackexchange narkive permalink

È possibile eseguire entrambe le operazioni, eseguirne l'hashing sul client in modo che se l'aggressore riesce a superare la sicurezza https non sarà in grado di vedere la password in testo normale. Quindi hash di nuovo sul server in modo che se l'aggressore ottiene le password memorizzate nel server, non può semplicemente inviarle al server e ottenere l'accesso alla password.

codetaku
2017-01-20 21:13:19 UTC
view on stackexchange narkive permalink

Se il tuo server avrà più possibili amministratori e non puoi necessariamente fidarti di tutti loro per non ottenere ram dump, dovresti davvero eseguire l'hashing lato client per proteggere gli amministratori dal rubare le password degli utenti [che potrebbero essere riutilizzate su altri siti web- -Nonostante questa sia una cattiva pratica, gli utenti lo fanno e continueranno a farlo], quindi hash quel lato server in modo che il furto della tabella non dia automaticamente agli aggressori la cosiddetta password in chiaro per il sito web stesso.

E fintanto che utilizzi la funzione di hash sicuro, puoi utilizzare lo stesso salt per entrambi i lati.

Se non ti fidi dei tuoi amministratori, ti trovi in un mondo di ferite molto più grande del doverti preoccupare che rubino una password utente occasionale dalla RAM.Se hai un amministratore di server dannoso, * non puoi * proteggere più le password degli utenti, anche tentando di eseguirne l'hashing lato client, almeno per un'app Web.
E che dire di questo problema di cloudflare che è appena apparso?Continuo a dire che l'hashing su entrambe le estremità è l'unico modo sicuro per farlo.Inoltre, se pensi che la modifica dell'output (il passaggio necessario per far fallire "il tentativo di eseguire l'hashing sul lato client") sia facile come sbirciare l'input, non hai mai visto un computer fisico.
user3738142
2016-04-07 23:49:20 UTC
view on stackexchange narkive permalink

A tutti gli effetti, vorrai eseguire l'hashing solo sul lato client. L'idea alla base di un hash è impedire a chiunque tranne l'utente di conoscere la password. Poiché qualsiasi buon sito dovrebbe utilizzare TLS, il fatto che l'hash venga inviato al server è irrilevante (si noti che anche se questo fosse un problema, l'invio della password in testo normale sarebbe altrettanto negativo).

Infine le risposte elencate sembrano non riuscire a rendersi conto che se il server viene compromesso ogni individuo sulla password del server verrà compromesso poiché le password vengono inviate ad esso in testo normale.

Solo perché una password viene inviata in testo normale non significa che venga memorizzata in testo normale.Se un utente malintenzionato ha compromesso il server al livello di poter vedere il traffico in arrivo, probabilmente può modificare il codice inviato al client per acquisire anche la password dell'utente.
Se il server viene compromesso, lo sarà anche il codice che il server invia al client, per eseguire l'hashing lato client, quindi questo è effettivamente un controllo inutile contro un server dannoso.
@Matthew Questo è visibile all'utente, però.L'acquisizione lato server non lo è.(Vale anche per Xander, ma non posso eseguire il ping di due contemporaneamente.) Se una banca abbastanza grande esegue l'hashing lato client, non sarei sorpreso se le persone iniziassero a monitorare i file javascript (forse la banca stessa da unIP) o se vengono visualizzati componenti aggiuntivi che controllano le modifiche dall'ultima visita.


Questa domanda e risposta è stata tradotta automaticamente dalla lingua inglese. Il contenuto originale è disponibile su stackexchange, che ringraziamo per la licenza cc by-sa 3.0 con cui è distribuito.
Loading...