Sì, sì lo so "non inventare i propri protocolli se non si è esperti". Non c'è bisogno di urlarmi, voglio solo sapere se c'è un difetto in questa idea e se qualcuno non l'ha fatto prima.
La motivazione qui è che voglio essere in grado di autenticare gli utenti. So che la soluzione standard è la password salata e hash. Ma non mi piace il fatto che la password stessa debba essere inviata al server per controllarla. Cosa succede se qualcuno ascolta? Il lato client può crittografare e inviare la password, ma non mi piace neanche perché forse la mia chiave di decrittazione perde e qualcuno che ha registrato il traffico web precedente può dedurre tutte le password. L'autenticazione non è un problema nuovo, quindi non mi soffermerò più sui pro e contro delle solite soluzioni.
La mia idea
Per ogni utente (a) il server memorizza una chiave pubblica (g ^ x_a) e la password crittografata con quella chiave pubblica (g ^ {x_a} * p_a). La chiave privata associata è stata prontamente distrutta o (meglio ancora) mai calcolata. Il generatore di gruppo g è tenuto in considerazione per la futura generazione di chiavi. La solita relazione si applica g ^ a * g ^ b = g ^ {a + b}. Il processo di autenticazione è il seguente
-
L'utente Alice chiede di essere autenticato
-
Il server Bob genera una nuova chiave pubblica temporanea g ^ t (di nuovo senza una chiave privata associata). Bob moltiplica questa chiave pubblica temporanea sui suoi dati di Alice. Questo risulta in g ^ t * g ^ {x_a} = g ^ {t + x_a} = g ^ {x_a} 'e g ^ t * g ^ {x_a} * p_a = g ^ {t + x_a} * p_a = g ^ {x_a} '* p_a. Bob dispone della chiave pubblica temporanea lasciandolo solo con una nuova chiave pubblica (g ^ {x_a} ') e la password di Alice crittografata con questa chiave. Invia la nuova chiave ad Alice.
-
Alice prende la chiave data da Bob che la usa per crittografare la sua password. Invia il valore crittografato a Bob.
-
Bob autentica Alice se il valore dato corrisponde ai dati crittografati calcolati nel passaggio 2.
Per ricapitolare
-
In nessun momento il server (o un hacker del database) può decodificare la password. Con le chiavi private disattivate la crittografia a chiave pubblica funziona in modo efficace come un hash.
-
Poiché ogni utente è crittografato con una chiave diversa, le password vengono effettivamente salate. Un tavolo arcobaleno non funzionerebbe qui.
-
Un hacker con un'immagine precedente del database non può dedurre i valori futuri di g ^ x_a * p_a ascoltando sul traffico web poiché ciò richiederebbe la deduzione della chiave temporanea (che richiede la risoluzione del log discreto). Pertanto, un'immagine del database trapelata non consente a un utente malintenzionato di impersonare gli utenti.
-
Né il server né il client dispongono di chiavi private da gestire. Solo il cliente ha bisogno di mantenere informazioni segrete e le informazioni segrete possono essere leggibili.
-
(inconveniente) un utente malintenzionato ha una piccola finestra di tempo tra i passaggi 2 e 4 in cui può penetrare il server e impersonare un utente utilizzando i dati trovati.