Password: archivia crittografato, visualizza in testo normale

1

Ho già fatto questa domanda a StackOverflow ma sono stato informato che è un po 'troppo ampio e conta di più qui invece. Quindi permettimi di copiare e incollare ciò che ti ho chiesto:

Ho un problema di sicurezza che non riesco a capire da solo sulla base delle mie conoscenze sulla sicurezza delle applicazioni web.

Diciamo che voglio creare un servizio in cui l'utente può memorizzare e VEDERE in chiaro le sue password per più servizi. In questo caso abbiamo alcune cose da considerare: misure di sicurezza di base crittografando le password memorizzate con hash, come proteggere le password nel caso in cui venissero rubate dal database, ad esempio, scaricando il database da un utente malintenzionato.

Ciò significa che le password dovrebbero essere archiviate crittografate, ma è possibile visualizzarle a un utente in testo normale. Il modo standard per archiviare le password per l'autenticazione consiste nel cancellarle ad esempio con bcrypt o con altri metodi aggiunti a sale e tale crittografia non consente di decifrare facilmente le password.

È ciò che voglio anche possibile ottenere? O c'è un altro approccio che dovrei prendere al posto dell'hashing ma comunque sicuro per memorizzare più password su più servizi da un singolo utente?

Mi limiterò ad aggiungere che supponiamo che una singola password o una serie di password sia un post del blog da visualizzare in un testo semplice solo dall'autore di tale post e in circostanze specifiche da amministratore e moderatore.

La tecnologia stessa probabilmente non è la cosa più importante qui, ma realizzerò questa applicazione usando il framework php e laravel.

Per memorizzare e visualizzare è una cosa, l'altra cosa è come proteggere tale applicazione da vari tipi di dirottamenti di messaggi criptati, dump di database e attacchi simili?

    
posta spectatorx 29.09.2018 - 17:16
fonte

3 risposte

1

In generale:

  • Un hash unidirezionale è non reversibile (da cui il termine a senso unico)
  • La crittografia è reversibile (a condizione che tu abbia la chiave di decodifica)

Per l'autenticazione regolare, utilizziamo gli hash delle password del negozio nel database. Quindi abbiamo cancellato una password immessa dall'utente e confrontata con l'hash nel database. In questo modo possiamo autenticare un utente senza mai memorizzare la password. Se l'utente sceglie una password "strong", sarà impossibile (o almeno immensamente difficile) ottenere la password del testo in chiaro degli utenti anche se l'intero sistema è stato compromesso.

Tuttavia, quello che stai chiedendo è di recuperare la password in chiaro - che non è richiesta nella maggior parte dei casi. L'utente conosce già la propria password (altrimenti non sarebbe stato in grado di collegarsi) - e se l'utente dimentica, generalmente ripristiniamo la password, prima autenticando prima un indirizzo e-mail o un numero di telefono, e poi scrivendo l'hash per la nuova password.

Se invece stai chiedendo di archiviare i "dati" sull'account che non è accessibile a nessuno senza la password, la soluzione generale utilizzata dalla maggior parte dei gestori di password è la crittografia dei dati con la chiave derivata dalla password dell'utente (perché le password degli utenti possono essere piuttosto deboli). I dati possono essere un blob crittografato, che sarebbe decrittografato sul lato utente usando la loro chiave derivata.

Lo svantaggio (sorta di) è che se l'utente perde la sua password, non c'è alcun recupero di questi dati, ma per la maggior parte dei gestori di password questa è effettivamente una 'funzione' perché nessuno vuole che questi dati siano archiviati in chiaro su qualsiasi server.

Ancora una volta, la soluzione sarebbe del tutto inutile se l'utente avesse scelto 'Password1234' come sua password principale, ma ci sono altre soluzioni per questo.

    
risposta data 01.10.2018 - 07:37
fonte
0

Un set sicuro

Raccomando di crittografare le password degli utenti utilizzando una chiave derivata dalla normale password dell'utente. Vorrei usare bcrypt per memorizzare la password, PBKDF2 per generare una chiave e AES per la crittografia. Un set-up potrebbe essere:

  • Salva la normale password dell'utente con bcrypt;
  • Quando l'utente si collega correttamente, usa PBKDF2 in Javascript per generare la chiave derivata dell'utente nel browser;
  • Invia all'utente il loro blob crittografato (AES);
  • Decifra il blob in Javascript, nella memoria del browser;
  • Quando l'utente ha finito di fare le sue cose, chiedigli di restituire un blob crittografato (AES).

In questo modo il server non vedrà mai la password di un utente o la sua chiave di crittografia. Interrompere la crittografia significherebbe forzare la password dell'utente, nel qual caso è comunque possibile accedere ai dati dell'utente.

Altre idee

Vorrei aggiungere che potrebbe non essere necessario per gli utenti visualizzare effettivamente le loro password. Ad esempio, la maggior parte dei gestori di password non visualizza le password ma le copia direttamente negli Appunti. Si potrebbe avere il loro blob decrittografato in memoria e avere qualcosa come un pulsante [copia] che copia la password negli appunti. Questo non sarebbe solo più sicuro, ma anche più conveniente per i tuoi utenti.

    
risposta data 29.09.2018 - 18:01
fonte
0

Dalla mia comprensione stai provando a creare un gestore di password / deposito. In questo caso non è possibile utilizzare l'hashing per l'archiviazione dei dati.

Faresti sicuramente meglio a usarne uno già là fuori perché è molto facile sbagliare.

Dovresti utilizzare la chiave crittografica simmetrica per crittografare le password e ricavare la chiave dalla password di un utente.

Non ti consiglierei di farlo da solo, ci sono molti modi per sbagliare. Cioè tasti deboli / funzione crittografica, memorizzazione / trasmissione errata della chiave segreta, integrità dei dati, violazioni del database ecc ...

Come accennato, fai riferimento a OWASP per le linee guida sulla sicurezza delle app, credo che ci sia un cheat sheet qui per aiutare gli sviluppatori a creare anche un software migliore.

    
risposta data 29.09.2018 - 18:54
fonte

Leggi altre domande sui tag