come autenticare l'utente nell'implementazione client-server

3

Quindi sto cercando di implementare un'applicazione client-server per l'invio di file su socket SSL. E sto cercando di decidere un design molto sicuro per l'autenticazione del client.

Il server avrà accesso a un database che contiene tutti i nomi utente e gli hash per le loro password (quindi se il DB viene violato le password saranno "sicure").

Mi chiedo se inviare la password come testo semplice che viene poi sottoposta a hashing sul server e confrontata con l'hash sul database sia l'opzione più sicura o meno.

Sembra un po 'insicuro inviando la password dei client senza alcuna casualità, ma non vedo in quale altro modo possa essere implementata.

Qualsiasi suggerimento sarebbe molto apprezzato!

    
posta Rakim 10.10.2015 - 22:53
fonte

2 risposte

4

Passa l'hash Se si hash la password sul client, si corre il rischio di introdurre un difetto pass-the-hash (PTH). Questo è un fenomeno reale, sorprendentemente comune che influisce in modo significativo sulla sicurezza della tua applicazione. È stato un problema di sicurezza chiave in Windows per anni: link

(EDIT: l'esempio di Windows sopra illustra i punti deboli del protocollo challenge-response NTLM. Un protocollo challenge-response ben progettato non dovrebbe essere vulnerabile al PTH, sebbene questi protocolli siano stati in gran parte superati dalla sicurezza del livello di trasporto. .)

In sostanza, se si hash prima la password, il valore che si sta utilizzando per autenticare contro il server è in realtà un hash di tale password e non la stessa password. Pertanto, un utente malintenzionato ha solo bisogno di conoscere tecnicamente l'hash e non la password stessa. Di conseguenza, se il database fosse stato compromesso, ora sei fuori combattimento, perché l'utente malintenzionato ha tutte le credenziali di cui ha bisogno.

Soluzione È possibile potrebbe aggirare questo problema tramite l'hashing sul client e l'hashing di nuovo hash sul server. Ciò significa che il database conterrà un elenco di hash che devono ancora essere decifrati prima che siano utili.

Tuttavia, ciò non aiuta in particolare il tuo problema di sicurezza dei trasporti. Qualsiasi valore inviato al server durante l'autenticazione (la password o solo un hash) è il valore che un utente malintenzionato può utilizzare per l'autenticazione con il server. Pertanto, un hash lato client ha sempre lo stesso profilo di rischio della password stessa. Non sei più sicuro trasferendolo come hash.

TLS Di conseguenza, è meglio concentrare l'attenzione su una buona configurazione TLS. Assicurarsi che il client non invii mai informazioni sensibili su un protocollo Cleartext e che accetti solo certificati server validi. Prendi in considerazione il blocco dei certificati, se disponibile. Configura il supporto solo per i protocolli e le suite di crittografia più sicuri sia sul server che sul client.

Alternate metodi di autenticazione (tutti potenzialmente potenzialmente invulnerabili al pass-the-hash se implementati correttamente):

Tali protocolli sono in gran parte non necessari nelle moderne applicazioni a causa della maggiore disponibilità e interoperabilità di TLS.

    
risposta data 11.10.2015 - 11:15
fonte
0

Quando usi già SSL, non c'è motivo di non usare anche SSL per ottenere la password dell'utente. Ciò, ovviamente, richiederà che tu abbia o meno un certificato da un'autorità di certificazione attendibile o che il cliente si fidi del tuo certificato. Quando parli di un eseguibile stand-alone che i tuoi utenti installano, puoi includere il certificato del tuo server in esso.

    
risposta data 11.10.2015 - 01:02
fonte

Leggi altre domande sui tag