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