Server che controlla la password del client senza mai entrarne in possesso

4

tl; dr: Mi chiedo quale sia il modo migliore per controllare una password quando il client non si fida del server.

Conosco due metodi comuni in cui i server possono verificare se la password di un utente è corretta:

  1. Il server memorizza l'hash della password, il client invia la password e il server esegue l'hashing della password e confronta l'hash con l'hash memorizzato. Se corrispondono, la password è corretta.
  2. Il server memorizza la password in chiaro e genera un salt che combina con la password e gli hash, quindi invia il sale al client. Il client esegue il hashing della password e sale e invia di nuovo quell'hash. Il server confronta i due hash e se corrispondono, la password è corretta.

Tuttavia, entrambi questi metodi richiedono che il client si affidi al server, e il primo richiede che la connessione sia sicura (mentre la seconda ovviamente non lo fa).

Ho pensato a un modo, ma non so se va bene dato che non ho un background in crittografia, non so quali contorsioni possano compromettere la sicurezza.

Il metodo è che quando il client crea un account, il client genera una coppia di chiavi RSA dalla sua password seminando il generatore di numeri casuali con l'hash della password e invia la chiave pubblica al server. Successivamente, quando il server vuole verificare se un utente ha la password corretta, può generare alcuni dati e inviarlo al client per firmare. Il client risponde con la firma e il server può verificare la firma e, se è valida, il client ha la password corretta.

In questo modo, il server non ottiene mai la password del client.

Questo potrebbe essere un modo stupido di farlo. Tuttavia, mi piacerebbe sapere qual è il modo comune per farlo, e se non ce n'è uno comune, cosa gli esperti di sicurezza qui pensano del modo in cui ho delineato. Come ho detto, conosco solo la crittografia su ciò che ho appreso per lo sviluppo web, che è ridicolo, quindi mi sarebbe sfuggito qualcosa di ovvio.

Informazioni aggiuntive

So che puoi solo generare una coppia di chiavi RSA e archiviare un file che contiene la chiave sul tuo computer, come quello che puoi fare per gli accessi SSH, tuttavia richiede di memorizzare la tua chiave da qualche parte, e se il computer è sequestrato quindi la tua password è compromessa. Il metodo che sto cercando dovrebbe richiedere solo una password oltre al nome utente.

    
posta Jecko 11.06.2013 - 20:43
fonte

2 risposte

3

Alcune varianti di Password PK (Authenticated Key Exchange) consentono l'autenticazione reciproca utilizzando una password; dai anche un'occhiata a Zero Password Password Proofs . Qui il server ha ancora la password dell'utente (creata durante l'impostazione dell'account), ma durante lo scambio delle chiavi il client non fornisce al server la password, piuttosto il client e il server eseguono un protocollo che dimostra il possesso della password e (nel caso di PAKE) stabilisce una chiave simmetrica condivisa.

Le sezioni 4.2 e 4.3 del tcpcrypt paper forniscono un'introduzione utile a un paio di protocolli (sebbene si basino su un concetto introdotto nel resto di tcpcrypt, ovvero l'ID di sessione).

Il metodo proposto fornisce l'autenticazione del client al server, ma non il server al client (ad esempio, l'Internet PKI oi protocolli di cui sopra, che tentano di autenticare i server anche sui client). È anche vulnerabile alle ipotesi di password offline - dato un singolo esempio di firma sui dati di sfida, un utente malintenzionato può consultare un elenco di password, generare la coppia di chiavi e vedere se corrisponde alla firma di esempio.

    
risposta data 11.06.2013 - 22:17
fonte
2

Uno dei metodi più interessanti che ho visto per qualcosa di simile è Bank of America's SiteKey. Il modo in cui funziona:

  1. Seleziona un'immagine dal loro database non pubblicato. (questo è memorizzato)
  2. Quindi fornisci loro una descrizione personalizzata per l'immagine. (questo è anche memorizzato)

Questa combinazione si chiama SiteKey. Prima di inserire la password ti mostrano il codice SiteKey per la verifica. Se è quello che hai inserito quando hai configurato l'account, dovresti essere in grado di fidarti del server, perché chiunque sfrutti il server dovrebbe avere le immagini dalla loro libreria di immagini. Il loro database di utenti, password e matchkey SiteKey e presenta quelli in un metodo che sembra autentico.

Se non lo è, non inserire la password.

Un potenziale problema al di fuori dell'implementazione bancaria è che questo è così appariscente, che se qualcuno memorizzava nella cache la tua sessione, poteva estrarre l'immagine e la chiave del sito se si rivolgevano direttamente a te. Probabilmente avrebbero usato altri bit dalla tua sessione per prelevare denaro direttamente dal tuo account (o trasferito altrove). Hanno però delle precauzioni per trasferire fondi verso conti aziendali da account privati.

    
risposta data 11.06.2013 - 22:42
fonte

Leggi altre domande sui tag