Ho sentito persone dire ancora e ancora che non dovresti implementare il tuo algoritmo di sicurezza, e vorrei chiederti se sto infrangendo questa regola.
Sto creando un'applicazione client-server tradizionale con una svolta: voglio crittografare tutti i dati sul client in modo che anche un utente malintenzionato che ottiene il controllo completo sul mio server non sia in grado di accedere ai dati degli utenti. Cioè, voglio una crittografia end-to-end per la mia applicazione client-server.
Il client crittografa i dati dell'utente con una chiave crittografica derivata dalla password dell'utente, quindi è importante che il server non sia in grado di capire la password perché ciò consentirebbe al server di decrittografare i dati dell'utente. Il client utilizza quindi il protocollo Secure Remote Password per evitare di inviare la password al server. Fin qui tutto bene.
Ora qui è dove il mio design diventa un po 'non ortodosso. Il problema è che gli utenti in generale sono molto cattivi nella creazione di password, in genere selezionando una password dall'elenco delle 10.000 password più importanti, il che renderebbe piuttosto facile per un utente malintenzionato che ha accesso al server di decrittografare i dati dell'utente. Pertanto ho intenzione di generare un insieme casuale di caratteri e aggiungerli al campo ID utente, quindi l'utente dovrebbe accedere con qualcosa di simile a queste credenziali:
User ID: John-CPE4E38J
Password: snoopy
Ma prima di elaborare queste credenziali il codice di login sposta i caratteri casuali nella password in modo che la libreria di autenticazione SRP sottostante veda questo:
User ID: John
Password: snoopy-CPE4E38J
Inoltre, il client offre di ricordare l'ID utente (es. John-CPE4E38J) in modo che la maggior parte delle volte l'utente debba ricordare la propria password.
Cosa ne pensi di questo approccio? Sto violando la regola dell'algoritmo di non-implementazione-proprio-sicurezza? O è un buon modo per rafforzare la sicurezza della mia applicazione?