Come memorizzare / non memorizzare password

5

Sto costruendo un sito web che permetterà agli utenti di aggregare le informazioni memorizzate nei loro profili online ("feed di dati") in un unico posto.

Mi chiedo - qual è il modo accettato (da un punto di vista della sicurezza) per memorizzare le informazioni su nome utente / password in un mio database?

Normalmente vorrei ricavare un valore hash salato da una password e lo memorizzerei, ma ovviamente non funzionerebbe in questo caso, poiché i siti web "data feeds" avrebbero bisogno di una password effettiva.

Memorizzare le credenziali in un testo chiaro non è un'opzione, poiché costituirebbe un enorme rischio per la sicurezza.

Non memorizzare le password in un database, chiedendo agli utenti di inserirle all'inizio di ogni sessione e quindi tenerle in una memoria interna non sembra una valida opzione, perché sarebbe troppo disturbo per gli utenti per inserire più volte la stessa password più volte.

Finora sembra che l'unica opzione sia crittografare le password in qualche modo, ma non so quali siano i migliori schemi di progettazione per tale opzione.

O forse c'è un modo per affrontare questo problema, non ho nemmeno preso in considerazione ...

Che cosa consiglieresti?

    
posta Mitten 20.06.2013 - 10:16
fonte

3 risposte

10

Dato che stai fornendo un servizio di gestione password online (limitato), potresti dare un'occhiata a come i gestori di password offline memorizzano le password per i loro utenti.

La mia progettazione di tovaglioli per tale funzione sarebbe quella di memorizzare la password nel database utilizzando una crittografia crittografica simmetrica, in cui la chiave è fornita dall'utente o derivata da una password fornita dall'utente. In questo modo, l'utente deve fornire una sola password all'inizio della sessione, indipendentemente dal numero di feed di dati che vengono sbloccati in questo modo.

    
risposta data 20.06.2013 - 11:07
fonte
5

Penso che quello che stai cercando è ciò che è noto come SSO (Single Sign On) :

Fonte: Wikipedia

a property of access control of multiple related, but independent software systems. With this property a user logs in once and gains access to all systems without being prompted to log in again at each of them. Conversely, Single sign-off is the property whereby a single action of signing out terminates access to multiple software systems.

La sfida di implementare il single sign on è che devi fornire i dettagli di implementazione per ciascun tipo unico di meccanismo di autenticazione che tutti i sistemi sembrano utilizzare. Tipicamente in un'applicazione OOP si scriverebbero Provider di autenticazione che sanno come recuperare credenziali e interfacciarsi con il sistema esterno a dove il sistema avvia ed esegue la "stretta di mano", e quindi mantiene questo trust per il resto del sessione.

Un hash a senso unico come un digestato salato non funzionerà, ma lo sai già. È necessaria una strong crittografia a due vie, ma per eseguirla è necessaria una chiave. Memorizza le credenziali crittografate nel database su una macchina separata e blocca il firewall di quei server esponendo solo le porte richieste. Tenere la chiave sul server delle applicazioni in modo non ovvio e offuscato. Mantenere la chiave su una macchina separata da quella che ospita il database e le credenziali crittografate riduce il rischio di compromissione di una singola macchina. Eventuali ulteriori passaggi che puoi pensare che offusceranno ulteriormente questo ti aiuteranno in sicurezza.

EDIT: Il suggerimento di Bart Van Ingen sulla chiave è la situazione ideale, in cui l'utente fornisce la chiave al momento del login, assolvendo alla responsabilità di mantenere la chiave / i tasti da sola sistema.

    
risposta data 20.06.2013 - 11:36
fonte
1

Il modo generale è usare un hash unidirezionale (più sale, ovviamente, e quando dico "hash" qui dovresti sempre aggiungere "plus salt"), memorizzare l'hash nel database. Quindi, quando l'utente immette una password, l'hash anche (utilizzando la stessa funzione di hashing) e confronta hash .

Tuttavia, non consiglio di creare il proprio sistema di sicurezza. Il motivo per cui la sicurezza è difficile , non ne sai più di quelli che hanno già costruito i sistemi di sicurezza (e il fatto che tu stia facendo questa domanda lo conferma), e non dovresti penserai che puoi fare un lavoro migliore di loro.

Il tuo software server web fornisce un sistema di sicurezza? Il tuo sistema operativo fornisce un sistema di sicurezza? Se è così, e se puoi, allora usa quelli invece di far girare il tuo. Sono provati e testati, sono stati trattati da esperti di sicurezza, sono progettati per soddisfare i requisiti di certificazione di sicurezza e, indipendentemente da ciò che pensi, non puoi scriverne uno migliore da solo.

Se questa non è un'opzione, cerca di utilizzare qualcosa come OpenID, Google, qualunque cosa. Basta usare qualcosa che ha già dimostrato di funzionare e che ha già funzionato sugli errori (e per non parlare dei rischi per la sicurezza).

    
risposta data 20.06.2013 - 11:35
fonte

Leggi altre domande sui tag