Sto creando un sito web che fornisce l'accesso degli utenti. Per questo, sto attualmente cercando buone strategie per gestire l'autenticazione.
Come lo sto facendo adesso
Il mio concetto attuale è modellato su quello che sembra essere il consenso comune giusto adesso. Le password vengono salate con 64 byte da / dev / urandom
e quindi hash con 100 round di SHA-512. Dopo ogni round, la password originale viene concatenata al risultato e quindi inserita nel round successivo. Quando un utente vuole accedere, invia le proprie credenziali al server, dove la procedura descritta viene quindi ripetuta (usando lo stesso salt, ovviamente) e confrontata con l'hash nel database.
Questa strategia sembra adeguatamente sicuro per me (per favore correggimi se sbaglio, è fondamentalmente solo il risultato della lettura di molte guide online e della visione di video di YouTube). Tuttavia, penso che abbia un grosso difetto, che è il client che deve inviare la password in chiaro al server. Sì, utilizzo HTTPS naturalmente, ma comunque, se la connessione è stata in qualche modo compromessa per qualsiasi motivo, lo è anche la password.
Il concetto alternativo
Quindi ho pensato a un approccio completamente diverso : utilizzando le chiavi PGP. Quando un utente si iscrive, genera una coppia di chiavi PGP, crittografa la chiave privata utilizzando una password di sua scelta e la invia al server. Quando vogliono accedere di nuovo, il server genera una stringa di caratteri casuali e la crittografa utilizzando la chiave pubblica. La stringa casuale crittografata e la coppia di chiavi vengono quindi inviate al client, che dovrà decrittografarle nuovamente per dimostrare di avere la password della chiave privata.
Questo metodo impedirebbe la trasmissione della password sulla rete e consentirebbe anche cose interessanti come chat crittografate end-to-end tra utenti. L'unico inconveniente che ho riscontrato è che il server deve fornire chiavi private crittografate praticamente a chiunque le richieda, rendendo gli attacchi di forza bruta molto più semplici. Potrei mitigarlo eseguendo un algoritmo di espansione della chiave costoso dal punto di vista computazionale sul lato client e utilizzare il risultato di ciò per crittografare la chiave privata.
Ma ancora non mi fido veramente dell'intera cosa, quindi ho mi piacerebbe sentire il tuo feedback se questa è una buona idea o se dovrei semplicemente restare fedele a come la sto facendo adesso.
EDIT:
Basato su alcuni dei risposte, penso che la mia domanda sia un po 'fuorviante. Il mio requisito è che l'unica cosa che gli utenti debbano fornire per un'autenticazione corretta è il loro nome utente / password e nient'altro, indipendentemente dal dispositivo che stanno utilizzando o dal fatto che abbiano effettuato l'accesso su quel dispositivo in precedenza.