Domanda

Qualche tempo fa ho aderito al nuovo progetto. Era in fase di sviluppo da parecchio tempo. La cosa che mi ha sorpreso è stata che le password di tutti gli utenti sono archiviate in forma non crittografata .

Ho spiegato alla nostra gestione enormi vulnerabilità di sicurezza: sembra che siano d'accordo con questo e vogliano rendere il progetto più sicuro. Anche i membri del team sono d'accordo.

Abbiamo circa 20K utenti nel sistema.

In realtà è abbastanza stressante farlo funzionare - migra le password non crittografate in forma crittografata . Se qualcosa va storto può portare al disastro del progetto.

Come posso ridurre questo stress? Backup? Unit test (test integrativi)?

È stato utile?

Soluzione

Bene, fai attenzione con il tuo backup perché conterrà password utente non crittografate :-)

Supponendo che le password siano archiviate in un database, una soluzione semplice sarebbe simile a questa:

1) Effettua un backup sicuro di tutti i dati della tabella

2) Crea una nuova colonna (Nome crittografato o simile)

3) Utilizzare una query UPDATE per aggiornare la nuova colonna di ogni riga con un MD5 della password non crittografata mentre si utilizza un salt di 32 byte o più grande. Praticamente ogni sistema di database oggi ha una funzione MD5, quindi non dovrai nemmeno lasciare il tuo prompt SQL

4) Mantieni nel frattempo la colonna in chiaro e aggiorna la tua applicazione / script di conseguenza per lavorare con la password salata.

5) Rinomina la colonna della vecchia password in chiaro per metterla temporaneamente fuori gioco e testare la tua applicazione. In caso di problemi, torna al passaggio 4 e correggi i tuoi errori.

6) Quando tutto funziona correttamente, rilascia la colonna della password in chiaro

7) Incoraggia gli utenti a scegliere una nuova password ora che hai un certo livello di sicurezza per mitigare gli effetti di eventuali attacchi precedenti che potrebbero aver avuto successo.

Altri suggerimenti

Che tipo di progetto è questo? Un'applicazione web, un'applicazione desktop?

Se stai percorrendo la strada del refactoring, c'è un motivo per cui le password devono essere archiviate in qualcosa di reversibile come la crittografia? In generale, è buona norma hash delle password con qualcosa come SHA, quindi hash dell'input con lo stesso algoritmo e confrontare i risultati. Memorizzi solo i valori con hash, non le password effettive. Ciò ti dà la possibilità di verificare che qualcuno abbia inserito la password corretta senza esporre i tuoi utenti alla possibilità che la tua crittografia venga interrotta e le loro password esposte.

Informazioni specifiche sul tuo approccio non sono qualcosa che posso fornire (dal momento che non so come funziona), ma la cosa migliore è creare una colonna aggiuntiva per archiviare le password con hash, hash le password esistenti, quindi tenere aggiornati con eventuali modifiche della password. Usa questa nuova colonna per tutti i nuovi sviluppi, quindi una volta che lo spostamento è completo e testato, elimina la colonna con le password in chiaro.

Scrivi molti test che testano molti casi angolari (maiuscoli e minuscoli, numeri, simboli, caratteri Unicode, password lunghe, ecc.). Quando stai sviluppando e testando, crea un sistema per tornare al vecchio sistema (fornendo ovviamente il vecchio elenco di password, poiché una volta che le password sono state sottoposte a hash non potrai riconvertirle direttamente). Salva una copia dell'elenco password corrente. Converti le password in un file di prova o in un database di prova, quindi utilizza la copia salvata delle password per verificare che tutto abbia funzionato. Ora sposta il sistema in produzione e assicurati che funzioni per i tuoi utenti. In caso contrario, hai già testato il piano per la migrazione al vecchio sistema. Dopo che è stato dimostrato che funziona per un paio di settimane, puoi eliminare l'elenco di password in chiaro e sei pronto.

Vorrei solo eseguire l'hashing delle password correnti, memorizzarle in un nuovo campo del database e iniziare a utilizzare quel campo durante l'eliminazione del campo della password. Vorrei quindi informare i miei utenti che ora sarebbe un buon momento per cambiare le password poiché hai implementato più meccanismi di sicurezza per mantenere i loro dati al sicuro.

Per avere un backup, basta fare SELECT * INTO Backup FROM UserData

Puoi ottenere maggiore sicurezza eseguendo entrambi i metodi di autenticazione (crittografati e non crittografati) per ogni tentativo di accesso e, se producono un risultato diverso, riceverai un'e-mail di avviso. Questa modifica non è visibile ai tuoi utenti, quindi può essere eseguita per settimane e persino mesi. Quando vedi che la vecchia e la nuova autenticazione funzionano per una percentuale sufficientemente alta di utenti, disattiva quella precedente.

Se possibile, puoi provare questo: invia un'email a tutti i tuoi utenti per aggiornare le loro password con un periodo di timeout, dopo il quale non possono funzionare se non cambiano le loro password. Hash queste nuove password e memorizzare l'hash. Ciò richiederebbe alcune modifiche sul frontend (ovvero i dati che restituisce).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top