Sto lavorando a un progetto in cui ogni utente avrà una coppia di chiavi RSA pubblica / privata. Gli utenti saranno in grado di inviare messaggi crittografati l'un l'altro utilizzando la chiave pubblica di ciascun utente di destinazione in modo che solo gli utenti target possano leggere il messaggio (simile a PHP openssl_seal ). Poiché desideriamo che l'utente sia in grado di utilizzare qualsiasi dispositivo per leggere o inviare un messaggio, la coppia di chiavi verrà memorizzata su un server API e la chiave privata verrà crittografata con la password dell'utente .
Quando un utente effettua l'accesso da un nuovo dispositivo, utilizzerà la sua password per decrittografare la chiave privata. Il problema è che idealmente, il server API non dovrebbe mai essere in grado di decifrare la chiave privata dell'utente, anche per autenticare l'utente . Inizialmente, stavo per inviare al client la chiave privata crittografata e lasciare che il client la decifrasse. Se il client può decrittografarlo, devono avere la password corretta, ma questo sarebbe vulnerabile agli attacchi del dizionario offline. Per evitare ciò, ho bisogno di autenticare l'utente prima io do loro la chiave privata crittografata.
Potrei chiedere al client di inviare la password al server e lasciare che il server tenti di decrittografare la chiave usando la password o anche solo di convalidare la password con un hash, ma in quel momento il server avrebbe temporaneamente la password e sarebbe in grado di decifrare la chiave privata dell'utente. Va bene, ma preferirei capire un modo per autenticare l'utente senza che il server conosca la loro password.
Nel mio caso, il client sarà un server web PHP o un'app mobile o desktop nativa, non un browser, quindi ho accesso a una vasta gamma di metodi crittografici. L'unico client autorizzato a effettuare la chiamata al server API per creare un account sarà il server Web PHP e al momento sto pianificando di creare una coppia di chiavi pubblica / privata e crittografare la chiave privata con la password dell'utente. Quindi invierà tali informazioni al server API (anch'esso in esecuzione PHP) per creare l'account. Il server API memorizzerà la chiave privata crittografata, la chiave pubblica, le informazioni sull'utente e tutti i messaggi crittografati, ma non sarà in grado di decodificarne nessuno.
Non sto cercando di proteggere da un attacco MITM qui. Tutte le chiamate API saranno su HTTPS. Il mio obiettivo è creare l'API in modo tale che, anche se il governo cinese potesse accedere al server API, non è ancora possibile leggere nessuno dei messaggi. Il server web può avere temporaneamente la chiave privata, non solo il server API.
Come faccio a consentire al server API di autenticare l'utente senza essere vulnerabile a un attacco brute-force offline e senza il server API che richiede la password dell'utente?
Sentitevi liberi di dirmi che sto facendo qualcosa di completamente sbagliato e suggerire qualcosa di completamente diverso.