Sto mantenendo un software legacy che utilizza MD5 nel modo seguente:
- Il client richiede un massimo di 16 byte durante l'autenticazione di un account.
- Il server genera un sale di 16 byte, lo collega all'account e lo invia al client.
- Il client aggiunge il 16 byte salt su una password, fa MD5 (passa + sale) e invia l'hash MD5 attraverso la rete.
- Mentre il server memorizza la password in chiaro nel database, recupera solo la password e confronta MD5 (database_pass + salt) con l'MD5 ricevuto (pass + sale) dal client.
Poiché non posso modificare il funzionamento del client, stavo pensando a cosa avrei potuto fare per interrompere la memorizzazione della password in chiaro sul database. L'idea alla quale sono arrivato era, invece di memorizzare la password in chiaro sul database, per memorizzare il sale di 16 byte utilizzato dal client e, alla registrazione, generare MD5 (pass + sale) e utilizzare questo MD5 come input per PBKDF2 con 64 byte di sale e HMAC-SHA512, 10000 iterazioni. Quindi, per autenticare, riceverei MD5 (pass + sale) dal client e PBKDF2 per controllare con l'hash PBKDF2 memorizzato.
Il mio dubbio è, questo renderà il mio server più sicuro? Dato che la password e l'MD5 (pass + sale) non verranno memorizzati nel database, la password non sarà più accessibile se il mio database perde, ma c'è un problema con l'utilizzo di MD5 prima?
Ci sono possibili problemi con questo approccio? C'è un approccio migliore ad esso?
L'unico inconveniente che posso pensare è che non avrò accesso alla password del client dopo un'autenticazione corretta, quindi cambiare il sistema di autenticazione in seguito sarà difficile. Avrò MD5 (pass + sale), ma cambiare il sale sarebbe impossibile.
Voglio farlo bene perché non potrò cambiare il sistema in seguito. Qualsiasi aiuto è apprezzato.