Seguendo il tuo esempio, inserirò i miei pensieri:
- Assicurati che l'indirizzo email non sia già in uso
- Per essere chiari, l'algoritmo di hash MD5 non aggiunge casualità a nulla. Di conseguenza, qui non sta facendo molto per te, se non rendendolo non immediatamente ovvio da dove proviene il tuo sale. Penso che sarebbe meglio usare un CSPRNG per generare il tuo sale piuttosto che basarlo sui dati dell'utente ed eseguirlo attraverso MD5 .
- Questa è un'applicazione nitpick, ma suona come se si stesse creando il record utente (passaggio 2) e poi si torna indietro e si memorizza il salt (passaggio 4) e quindi si memorizza la password hash (passaggio 8). Non c'è motivo per cui non puoi fare tutto questo in un'unica operazione di inserimento. Otterrai prestazioni migliori, ma soprattutto, il tuo codice sarà più semplice e facile da mantenere.
- Per essere chiari, non vuoi utilizzare un metodo di crittografia per cancellare le tue password. Hashing e crittografia sono due concetti separati con diversi algoritmi preferiti. Assicurati di fare l'hashing: non crittografare. Da quello che hai scritto, penso che tu sia sulla pagina giusta e stia semplicemente usando la terminologia sbagliata. È un errore facile da fare, ma la differenza è abbastanza critica che vale la pena segnalarlo.
- Non c'è una buona ragione per utilizzare due algoritmi di crittografia separati. L'unica ragione per fare una cosa del genere è far sì che le persone non possano provare a forzare le password se trovano il tuo database. Tuttavia, è una misura di sicurezza che si basa sul fatto che il codice sorgente viene tenuto segreto. A volte vengono entrambi trapelati. Questo passaggio non è inutile , ma non è altrettanto utile come potresti pensare e complica il tuo codice. Se si desidera una protezione come questa, includerei solo un pepe e attenersi a una singola passata di hashing della password sicura algoritmo.
- Al momento dell'accesso, assicurati di restituire sempre all'utente un singolo messaggio di errore non descrittivo "Combinazione nome utente / password non valida"
- Non fare un semplice confronto tra la password con hash dell'utente e quella che esce dal database (cioè
$hashed_input == $user_hash
). Ci sono alcuni modi sottili in cui un simile confronto diretto può essere usato da un malintenzionato per aiutare a decifrare le password. Alcune lingue hanno metodi di supporto per facilitare il confronto delle hash delle password. Usane uno o trovane uno.
Ci possono essere un gran numero di modi sottili per i bug di sicurezza di insinuarsi nel sistema di login di un'applicazione, che può facilmente essere perso in una panoramica come questa. Considerando che è la prima linea di difesa della tua applicazione, è importante ottenere l'autenticazione dell'utente giusta. Di conseguenza, la soluzione migliore è utilizzare un modulo di autenticazione ben collaudato e ben supportato che esiste già, piuttosto che crearne di nuovi. Se decidi di continuare a scrivere da solo, allora dovresti almeno pubblicare il tuo codice su codereview.stackexchange.net in seguito.