Come verificare una password / chiave sulle derivazioni successive dei tasti

2

La prima volta che un utente accede alla nostra app, ricaviamo una chiave AES dalla sua password usando PBKDF2. Il tasto AES viene tenuto solo nella RAM e utilizzato per crittografare e avvolgere altre chiavi e dati durante la sessione.

Quando termina la sessione corrente, gettiamo via la chiave ma conserviamo i dati crittografati e le impostazioni di derivazione (conteggio salt / iteration / etc.) per la prossima volta.

Nei login successivi, ri-deriviamo la chiave in base alla password e alle impostazioni, ma vogliamo verificare che la chiave (password) sia valida (con un ragionevole livello di sicurezza) prima di tentare di usarla.

Non vogliamo anche calcolare un hash sulla password perché la derivazione della chiave è già (volutamente) long-running e non vogliamo rendere quel processo più lungo con un altro algoritmo hash di lunga durata.

Ho visto alcune soluzioni a questo, ma mi chiedo se ci sia uno standard da seguire. Quello che ho visto finora:

  • In Cryptography Engineering, Schneier e altri suggeriscono di prendere i dati hash dall'iterazione n-1 della funzione di derivazione e di eseguire l'hashing con sale, password, ecc. per formare un codice di verifica. È possibile memorizzare questo e calcolare lo stesso codice per il candidato mentre si ottiene la chiave. Se non corrispondono, tu rifiuti. Lato negativo: se utilizzi le librerie crittografiche di terze parti, probabilmente non sarà possibile accedere allo stato interno di PBKDF2 per farlo.
  • Calcola qualcosa come SHA256(key+salt+password) e memorizzalo. Calcola per il candidato e rifiuta se non corrispondono.
  • Usa la chiave per crittografare qualcosa con un pattern o suffisso noto e memorizzala. per es.

    E(key, <32 bytes random data> + <32 bytes of 0>'.
    

    Archivia questo, decrittalo usando la chiave candidata e controlla se il suffisso corrisponde. Il numero di 0 che scegli determina la possibilità di un falso positivo.

Quest'ultima sembra semplice ed efficace, ma sto cercando consigli chiari da un esperto / autorità in materia.

    
posta Mike Weller 03.09.2015 - 19:10
fonte

1 risposta

1

Normalmente, quando si cripta una chiave simmetrica, si desidera includere anche un controllo di integrità (un MAC ) a rilevare le alterazioni. Ci sono pochissimi modelli di attacco in cui gli attaccanti che possono osservare dati non possono anche modificare dati, quindi è normalmente necessario un controllo dell'integrità.

Il controllo di integrità può essere un algoritmo MAC stand-alone, in genere HMAC; oppure può essere integrato nella modalità di crittografia (come in GCM ). Quest'ultimo è altamente raccomandato perché assemblare un sistema di crittografia e un MAC in modo sicuro è molto più complicato del solito (es. Vedi questo ).

Supponendo che il tuo sistema di crittografia includa un controllo di integrità, allora il metodo naturale e sicuro per verificare la correzione della password, nella tua situazione, è mantenere un piccolo file crittografato con contenuti convenzionali: decodificare il file comporta la verifica del MAC , quindi la password (indirettamente).

    
risposta data 03.09.2015 - 20:00
fonte

Leggi altre domande sui tag