OAuth2 password analogica (privata, unica e statica) - Crittografia

2

Sto facendo una webapp che crittografa i dati di ciascun utente, usando AES-256, con una chiave univoca per ogni account. Sto pensando di aggiungere il collegamento esterno tramite lo schema "Accedi con Google". Tuttavia, ho fatto qualche ricerca e non sono sicuro se sia possibile nella mia situazione.

In questo momento, memorizzo l'hash della password dell'utente utilizzando 10 iterazioni di Argon2 Hash e gli accessi al processo utilizzando l'hash built-in Argon2. A quanto ho capito, Google OAuth2 sostituirà questa parte perfettamente. Tuttavia, è la parte successiva di cui sono preoccupato.

Per ogni utente, creo una stringa casuale unica di 50 caratteri usando Apache Commons RandomStringUtils.random (...); funzione (incorporando sia lettere che numeri). Io uso questa stringa come chiave di crittografia master per l'account. Tutti i contenuti dell'utente sono crittografati con questa chiave. La crittografia effettiva viene eseguita utilizzando il codice AES basato su password Spring AES, in cui questa stringa della chiave master viene passata come password di crittografia.

Ma ecco il problema: creo quindi un BCrypt Salt casuale (configurato su 12 iterazioni) univoco per ogni utente e memorizzo questo salt raw nel record dell'account dell'utente nel DB. Quando l'utente crea il proprio account, prendo la sua password di testo non elaborato e l'hash con BCrypt, usando il proprio unico BCrypt salt dell'account. Questo hash BCrypt della loro password di testo non elaborato è il Meta-Key che uso per crittografare la loro chiave principale. Quindi memorizzo la loro chiave master crittografata nel proprio record DB account. Quindi, quando l'utente effettua il login, prendo la loro password di testo non elaborato, genera di nuovo l'hash utilizzando il sale memorizzato nel DB e lo usa come Meta-Key per decrittografare la propria chiave master dal DB. Ricalcolo quindi la loro chiave master utilizzando la chiave privata globale del server (la stessa per tutti gli utenti), quindi incorpora la chiave master Server-Crittografata in un token JWT e la inviano al client per fungere da token senza stato. Quando fanno una richiesta, restituiscono il token, il server web estrae la chiave master dal token, la decrittografa con la chiave privata globale del server e quindi la utilizza per decrittografare i dati dell'utente.

A meno che tu non veda qualcosa di gravemente sbagliato nel mio progetto, le mie domande sono: se passo a OAuth, l'utente non mi fornirà più una password, riceverò solo un token dal provider OAuth (Google in questo Astuccio). Ma quel token sarà diverso ogni volta che si collegheranno. Ho bisogno di qualcosa che sia unico per ogni utente, che sia anche statico e che sia esattamente lo stesso ogni volta che si accede. Ma deve anche essere privato e amp; non riproducibile, quindi non posso usare qualcosa come il GUID dell'account Google (presumendo che ti diano accesso a qualcosa del genere), perché sarebbe accessibile ad altre app / utenti.

OAuth fornisce qualsiasi meccanismo per un qualche tipo di token / ID che sia sia privato che amp; Unico per la coppia Utente / App e anche Statico attraverso accessi separati? A questo punto, sto arrivando alla conclusione che OAuth è impossibile nella mia situazione, ma ho pensato di vedere se qualcuno avesse qualche idea. Sono aperto a riprogettare il mio processo di sicurezza, ma deve mantenere una chiave di crittografia univoca per ciascun utente.

Grazie per il tuo tempo.

-Yurelle

    
posta Yurelle 20.06.2017 - 20:37
fonte

0 risposte

Leggi altre domande sui tag