ci sto pensando un po 'perché non dovresti mai memorizzare le password degli utenti in testo semplice. quindi ho trovato una soluzione possibile per te.
Quando un utente si iscrive a un nuovo "servizio" sul proprio account (ad esempio aggiunge gmail o yahoo, ecc.), ciò che si dovrà fare è:
-
Chiedi nuovamente all'utente la password del sito (e confermala)
-
Hash la loro password di nuovo con un nuovo salt casuale (che dovresti memorizzare) (con un algoritmo hash diverso da quello che usi per il tuo archivio di password principale) NON CONSERVARE QUESTO !! da ora in poi mi riferirò a questo come KEY_A
-
genera una chiave dsa o rsa con password con KEY_A come password per il file di chiavi. Questo sarà usato come chiave di enctyption per il prossimo passo
-
Utilizza un metodo di crittografia sicura (forse mcrypt se in php dal momento che è incorporato) e memorizza la loro password 'criptata'
-
Quando un utente effettua l'accesso e una nuova sessione viene creata rehash la propria password con lo stesso metodo utilizzato nel passaggio 2, crittografarla con una chiave derivata da qualcosa che è univoco per la propria sessione ma non memorizzata (Diciamo user_agent + session_start_time + il loro indirizzo IP + un sale specifico dell'utente). Archivia questo valore crittografato in un cookie http_only, cancella detto cookie al logout, costringili a effettuare nuovamente il login se il cookie non è presente.
Ora hai un metodo per archiviare i loro gmail / hotmail / etc. le credenziali in un modo in cui non hai modo diretto di sapere come decrittografarle senza la password che usano per il tuo servizio.
Molto probabilmente sarà anche prudente assicurarsi di non archiviare alcuni dei componenti utilizzati nella crittografia del cookie (quindi disabilitare almeno la registrazione dell'agente utente nella configurazione del server web.)
Ora per poter eseguire un accesso a iMap (o qualcosa di simile, dovresti semplicemente decifrare il cookie http_only dal punto 5 per ottenere KEY_A, usare KEY_A per sbloccare la chiave RSA / DSA, quindi usare la chiave sbloccata per decifrare la password al loro servizio, quindi eseguire la transazione iMap, e solo per essere paranoico ri-zero (in php puoi semplicemente chiamare unset ()) le variabili che contengono la loro password in chiaro, KEY_A, e la loro chiave rsa / dsa sbloccata il linea di codice dopo che non sono più necessari.
Inoltre, assicurati che anche il tuo servizio DNS sia configurato in modo sicuro. (forzare DNS-SEC, forse anche impostare la risoluzione DNS dei server Web per passare attraverso un'interfaccia di rete di servizio e non quella visibile sul Web ed eseguire la risoluzione DNS tramite un indirizzo IP visibile non correlato.) Assicurarsi che il proprio https i certificati sono completamente al top.
Poiché invierai in modo efficace le password private delle persone sul Web, l'ultima cosa che desideri è l'inondazione dell'indirizzo IP del tuo server web con il reindirizzamento dei pacchetti di risoluzione DNS di udp consente di dire "mail.google.com" a un proxy imap personalizzato che hanno creato allo scopo di sniffare le password.
L'unico svantaggio di questo metodo (che mi viene in mente) è quando l'utente cambia la password per il servizio che dovrà reinserire la password a tutti gli altri provider di posta elettronica che hanno registrato con esso. (perché la password crittografata memorizzata non sarà più valida.)
E ultimo ma non meno importante (im supponendo che questo sarà fatto, ma non ho modo di esserne sicuro.) cancella TUTTI il codice di debug relativo a queste routine prima di andare in diretta!
L'intera chiave per questo è garantire che KEY_A non possa essere derivato da qualsiasi cosa tu stia memorizzando (quindi non scorciare semplicemente rifilando l'hash della loro password, hash in un modo diverso, con un diverso salt.)