Sto lavorando a un progetto (non ad alta sicurezza) che al momento non è in diretta ma potrebbe essere pubblicato in un dato momento.
Abbiamo un'API REST (implementata utilizzando Restlet e Neo4j) in esecuzione su un server e un'app client Android.
Per mantenere le cose senza stato, abbiamo bisogno di inviare informazioni di autenticazione insieme a ciascuna richiesta. Abbiamo deciso di utilizzare un approccio basato su MAC: firmiamo un insieme di valori di intestazione e il corpo dell'entità di ciascuna richiesta HTTP utilizzando l'algoritmo HMAC-SHA256. Quindi inseriamo l'hash insieme al nome utente nell'intestazione Authorization
della richiesta.
Per il segreto HMAC, utilizziamo una password che viene scelta dall'utente. Per rendere le cose più sicure, abbiamo cancellato la password prima di usarla e memorizzarla nel client.
Naturalmente, affinché il server possa convalidare l'intestazione HMAC-SHA256, dobbiamo trasmettere il segreto una volta. Ma poiché ciò accade solo una volta, non è un grosso rischio per la sicurezza.
Il problema con questa configurazione è la memorizzazione sicura delle password dell'utente. So che le password non dovrebbero mai essere sottoposte a hash senza usare un salt per prevenire gli attacchi di rainbow table. Ma quando creo un sale sicuro / casuale, un client che registra un utente per la prima volta non ha modo di accedere a quel sale per generare l'hash corretto.
Quale sarebbe la migliore decisione in questo caso? Devo semplicemente archiviare le password usando un algoritmo di hashing "convenzionale" come SHA256 senza usare sale? Immagino che sarebbe molto negligente. Potrei anche usare un algoritmo più sicuro come bcrypt o PBKDF2 con un "dummy salt" come lo username un hash MD5 del nome utente e un conteggio di iterazioni più elevato. Anche se il sale è noto, sarebbe molto lento e doloroso generare tabelle arcobaleno.
Il bcrypt con un "security-by-obscurity" sarebbe abbastanza sicuro? Oppure l'intera configurazione non è sicura e dovrebbe essere scambiata con un altro metodo di autenticazione?