Sto crittografando e archiviando correttamente una serie di dettagli utente?

3

Mi è venuta in mente una procedura di memorizzazione dei dettagli dell'utente che era, all'inizio, basata sulla letteratura sulla sicurezza attuale, ma poi ho continuato a scrivere senza fare davvero tutte le verifiche incrociate che avrei dovuto fare.

  • Nome utente, password e dettagli personali inseriti.

  • Viene generata una chiave simmetrica casuale a 128 bit.

  • Vengono generati due vettori di inizializzazione casuali.

  • L'array in cui sono archiviati i dettagli personali (nome, email, ecc.) è crittografato con AES-128 utilizzando la chiave appena generata e il primo vettore di inizializzazione.

  • La stessa chiave simmetrica viene quindi crittografata con AES-128 - utilizzando la password di testo semplice della password dell'utente come chiave e il secondo vettore di inizializzazione.

  • La nuova chiave crittografata, vettore di inizializzazione 1 & 2 e l'array crittografato di dati personali viene archiviato in un oggetto che viene serializzato in un file sotto un ID, un hash del nome utente dell'utente.

  • Quando il programma recupera i dettagli - blocca il nome utente dell'utente corrente, cerca l'hash nel file "users" (l'ID), recupera l'oggetto ad esso associato, decodifica la chiave e utilizza la chiave decrittografata per decifrare i dati dell'utente.

È grottescamente insicuro? Mi manca qualcosa di ovvio?

    
posta Quoi 04.08.2015 - 13:33
fonte

2 risposte

1

Pochi commenti al flusso fornito:

  1. Assicurati che quando dici "Sono generati due vettori di inizializzazione casuali.", sono davvero casuali crittograficamente sicuri.

  2. La crittografia simmetrica deve essere crittografata con autenticazione.

Pertanto, ti suggerisco di aggiungere un MAC (ad esempio usando HMAC). Per esempio:

1. AES-encrypt: plaintext + secret key + fresh-generated random IV = ciphertext C1.
2. C2 = IV + C1.
3. MAC = HMAC(K , C2) where K is a different secret key independent the first used.
4. C3 = C2 + MAC.
    
risposta data 04.08.2015 - 13:56
fonte
0

Come suggerisce il commento di @SJPM, lo schema come descritto manca di alcuni dettagli necessari per rispondere in modo completo, ma con alcune ipotesi, possiamo comunque ottenere un paio di punti generali. In particolare:

  1. La password dell'utente non deve essere utilizzata direttamente come chiave di crittografia chiave. Dovresti utilizzare un PBKDF appropriato come PBKDF2, bcrypt, scrypt o un altro per trasformare la password in una chiave casuale appropriata con un fattore di lavoro appropriato.

  2. Perché stai tagliando il nome utente? Perché non usare semplicemente lo username come chiave direttamente? Forse questo ha un valore per l'applicazione, ma non sembra avere alcun vantaggio per la sicurezza, per quanto posso dire dalla descrizione del tuo schema.

  3. Per reiterare il punto 1, impostare il fattore di lavoro in modo appropriato per il tuo KDF è fondamentale. Se il calcolo di una chiave da una password candidata può essere fatto troppo rapidamente, la crittografia sarà solo una finestra di mascheramento e non offrirà una protezione significativa dagli aggressori offline che riescono a ottenere una copia dei dati crittografati.

risposta data 01.03.2016 - 18:13
fonte

Leggi altre domande sui tag