Best practice per la protezione tramite password di una chiave segreta

6

Quali approcci sono generalmente accettati per generare una chiave simmetrica protetta da password?

La mia intuizione è di generare e memorizzare una stringa casuale di lunghezza appropriata come chiave protetta da password, quindi HMAC con una password PBKDF2ed per ottenere la chiave simmetrica effettiva. Con questo approccio, il passaggio PBKDF2 è necessario o superfluo? Esiste un approccio migliore (ad esempio, XOR dei bit della chiave generata con i bit della chiave della password PBKDF2ed)?

Modifica: dopo aver reso questo post mi sono reso conto che ha più senso fare HMAC(key, password) rispetto a HMAC(PBKDF2(password), key) .

Aggiornamento: la risposta è PBKDF2(SHA256, password, key, iterations) .

    
posta Stephen Touset 12.09.2012 - 02:55
fonte

2 risposte

6

PBKDF2 è progettato esattamente per lo scopo a cui stai pensando: fare il tradeoff tempo per attaccare una sorgente di bassa entropia paragonabile a quella di attaccare l'output risultante come se fosse una fonte di entropia puramente alta.

In un esempio forzato, potrei fare la mia password usando uno dei quattro numeri. La chiave risultante potrebbe essere uno di 32 numeri. Per renderli ugualmente sicuri contro le forzature brute, è necessario impiegare tutto il tempo per testare uno dei quattro tasti come se fosse necessario testare sette dei 32 tasti (32/4 - 1 perché anche il 1/32 risultante deve essere testato). Per proteggersi dalle tabelle arcobaleno, sarebbe utile anche aggiungere un sale.

PBKDF2 porta a termine le attività sopra descritte per rallentare il processo e utilizzare un sale. A meno che tu non stia eseguendo l'output da esso attraverso qualcosa che ha un processo operativo relativamente lento, prendere l'output da PBKDF2 sarebbe appropriato.

Altre opzioni di rafforzamento chiave come bcrypt possono anche essere un'opzione. In ogni metodo che utilizzi, assicurati che il tuo output sia composto da un numero di bit pari alla tua chiave. Puoi ridurre l'hash a una dimensione più piccola, ma non utilizzare mai l'hashing per ottenere una chiave più lunga.

    
risposta data 12.09.2012 - 03:59
fonte
3

Ci sono due metodi, usando PBKDF2 (RFC 2898) con la tua password principale e un salt per generare la chiave simmetrica (dove il sale è la stringa casuale a cui fai riferimento), oppure usi l'HMAC-based Extract-and- Espandi la funzione di derivazione chiave da RFC 5869 per generare la chiave simmetrica dalla tua password principale, una salt e alcune informazioni specifiche della chiave.

Nota: HKDF è appropriato solo se la tua password principale ha un'alta entropia & lunghezza in quanto non itera come PBKDF2.

bcrypt & scrypt sono altre possibilità.

    
risposta data 12.09.2012 - 18:26
fonte

Leggi altre domande sui tag