Come conservare le password in modo sicuro nel mio server?

9

Disclaimer : so che dovrei usare bcrypt a memorizza in modo sicuro le password dell'utente . Per favore, continua a leggere.

Desidero memorizzare le credenziali per diversi servizi di posta elettronica per ciascun utente. Quindi, se accedo con il mio nome utente e password (che è correttamente hash), posso accedere a diverse e-mail, tra cui 2 @ hotmail, 1 @ gmail, la mia università e molte altre tramite imap. Sto usando imap per leggere le e-mail, che richiede l'e-mail e la password in testo normale. Quindi, come posso archiviare in modo sicuro queste password?

Cosa ho pensato:

  • Alcuni servizi offrono un'API. Usali quando possibile.

  • Crittografa le credenziali di ogni utente con le sue password di accesso, quindi solo un utente che conosce i suoi dettagli di accesso può decodificare le sue credenziali e quindi accedere alle e-mail. Non sono sicuro di come farlo correttamente, quindi ecco dove ho bisogno di aiuto. Userei mcrypt_encrypt() da PHP con MCRYPT_RIJNDAEL_256 .

  • Richiedi la password ogni volta che l'utente effettua il login. Non pratico se l'utente ha più di 2 servizi connessi.

TL; DR

Come posso memorizzare le password in un db in modo da poterle usare con imap in seguito?

    
posta Francisco Presencia 22.06.2014 - 16:46
fonte

2 risposte

6

Affronta il problema che deve affrontare ogni gestore di password. Credo che la loro soluzione sia utilizzare un algoritmo simmetrico per crittografare i dati sensibili e utilizzare una password principale per ciascun utente per ricavare una chiave di decrittografia per tutte le sue password salvate. Questa password principale dovrà essere inserita ogni volta che si riavvia lo script o l'applicazione o, nel caso di un'applicazione Web, ogni volta che l'utente esegue l'accesso.

Questo è fondamentalmente ciò che descrivi nel tuo secondo punto elenco. Lo strumento di crittografia di cui hai bisogno è PBKDF2 : usa questo nella password di accesso dell'utente quando è inviato. La chiave risultante dovrebbe essere idonea per crittografare / decodificare le password nel database utilizzando MCRYPT_RIJNDAEL_256 .

Nota a margine: assicurati di utilizzare diversi vettori di inizializzazione ogni volta che crittografati nuovi dati!

    
risposta data 23.06.2014 - 13:31
fonte
1

Potresti prendere in considerazione la distribuzione del tuo ambiente SSO (avviso che non ho detto di "eseguire il rollover").

Uno dei miei contributi personali è il servizio di autenticazione centrale di Jasig ( link ) che funge da piattaforma di autenticazione centralizzata per i tuoi utenti per accedere a. Le tue applicazioni "client" dovrebbero quindi essere "CAS-ified" (integrate) con CAS in modo che autorizzi l'accesso dell'utente se sono già state autenticate da questo software di terze parti.

Per quanto riguarda la tua domanda, il componente a cui ho contribuito è stata la loro estensione ClearPass ( qui ) che, pur aumentando rischio di sicurezza come in qualsiasi applicazione che utilizza la crittografia per l'hashing, consente di proxy per credenziali di testo non crittografato ( qui ).

Purpose (ClearPass): To enable single sign-on into some legacy application it may be necessary to provide them with the actual cleartext password. While such approach inevitably increases security risk, a number of institutions found it to be a "necessary evil".

Dopo aver completato con successo la transazione ClearPass, si finisce con il login e la password dell'utente. Si noti che queste sarebbero le credenziali di accesso dell'applicazione dell'utente; ciò che l'utente utilizza per accedere alla tua applicazione che gestisce l'autenticazione per i servizi di posta elettronica di terze parti per loro .

Le credenziali di accesso in mano, è possibile richiedere nuovamente la password dell'applicazione tramite ClearPass più e più volte per decrittografare le password di servizio su richiesta che sono state crittografate originariamente con la loro password di accesso in modo da risolvere i problemi di "Password Manager" descritti da @executifs. L'archiviazione della password dell'applicazione dell'utente viene gestita da ClearPass, crittografata da EncryptedMapDecorator e archiviata in memoria (o in memcached, ecc.).

Per inciso, ecco una breve pagina wiki sull'implementazione crittografica Ho scritto non molto tempo fa quando lavoravo con la crittografia e ClearPass (e sì, è stato sottoposto a ## crypto su Freenode per la critica di massa e revisionato in base alle esigenze) nel caso in cui fosse utile.

Per il codice attuale, ecco alcuni esempi in Java , Nodo. e sì, anche C # . Si noti che le ultime due sono essenzialmente le mie porte di EncryptedMapDecorator.java rispetto alla derivazione della chiave basata sulla password (derivante una chiave segreta basata sulla passphrase), il vettore di inizializzazione (byte casuali protetti) e persino l'imballaggio. Dopo aver studiato le risorse che ho delineato qui e questi esempi di codice, dovresti avere abbastanza conoscenze per essere in grado di portarlo su PHP, o almeno iniziare comunque:)

Spero che questo aiuti!

    
risposta data 25.06.2014 - 19:18
fonte