2013-06-19 15 views
5

Qualcuno sa di un modo per ottenere un valore di chiave a 256 bit generato da una passphrase di qualsiasi lunghezza? La crittografia non può essere salata poiché i valori crittografati devono essere generati nuovamente e confrontati nel database. Quindi un valore deve generare la stessa stringa crittografata ogni volta che viene crittografata.generazione di un valore chiave AES 256 bit

Attualmente sto usando una chiave di 32 caratteri che funziona sull'assunzione possibilmente errata questo è 256 bit?

Quindi, vorrei che la "quick brown fox" sia convertita in una chiave AES 256 bit adatta?

+2

"La crittografia non può essere salata poiché i valori crittografati devono essere generati di nuovo" Ecco perché è comune memorizzare il sale insieme alla password con hash. In questo modo, se due utenti diversi hanno la stessa password, produce diversi hash, ma per un singolo utente, la stessa password produrrà sempre lo stesso hash. – svick

+0

per essere sinceri, senza il sale non è affatto criptato. Non dovrebbe essere possibile eseguire una ricerca diretta del database rispetto a un valore crittografato. – Matthew

risposta

12

È possibile costruire la Rfc2898DeriveBytes Class con una password qualsiasi dimensione e quindi derivare una chiave di dimensioni desiderate in questo caso, 256 bit (32 byte):

private static byte[] CreateKey(string password, int keyBytes = 32) 
{ 
    const int Iterations = 300; 
    var keyGenerator = new Rfc2898DeriveBytes(password, Salt, Iterations); 
    return keyGenerator.GetBytes(keyBytes); 
} 

Per produrre un'uscita deterministico (ie lo stesso input produrrà lo stesso output) sarà necessario codificare hard il sale. Il sale deve essere di almeno 8 byte:

private static readonly byte[] Salt = 
    new byte[] { 10, 20, 30 , 40, 50, 60, 70, 80}; 
+0

Vedi la mia spiegazione per una descrizione più teorica di sopra. Si noti che 'Rfc2898DeriveBytes' implementa PBKDF2 :) –

+0

Grazie - questo è stato molto utile. KeySize dovrebbe essere 32 anche se per ottenere un array di 32 byte key? – bhs

+0

Sì, credo che sia stato un errore di ByteBlast. Ti consiglio inoltre di codificare la password in byte utilizzando la codifica UTF-8, poiché la funzione Rfc2898DeriveBytes non specifica esplicitamente la codifica che utilizza. È difficile quando si utilizza la funzione da un altro runtime. –

-1

È possibile utilizzare una funzione di hash che fornisce l'uscita a 256 bit dall'input di qualsiasi lunghezza, ad esempio SHA256.

+1

Ufficialmente un hash non è una funzione di derivazione chiave basata su password e non deve essere utilizzato direttamente come tale. –

2

Probabilmente il modo migliore è usare PBKDF2 utilizzando SHA256 (che genererà uscita 256 bit) e un'applicazione specifica sale & iterazione conteggio. È necessario essere consapevoli del fatto che l'uso di un sale specifico per l'applicazione ha eliminato parecchio la protezione da PBKDF2, pertanto potrebbe essere necessaria una protezione aggiuntiva per alleviare questo problema. Un metodo sarebbe quello di assicurarsi che il database sia sicuro e che sia possibile utilizzare un numero massimo di tentativi.

È corretto specificare che una passphrase a 32 caratteri non è una chiave a 256 bit. Non contiene abbastanza entropia e alcuni byte potrebbero non avere nemmeno rappresentazioni di caratteri valide.

+0

Vedere risposta ByteBlasts per un'implementazione di sopra :) –

+0

Grazie - quindi una matrice a 32 byte del metodo sopra riportato è una chiave a 256 bit? – bhs

+0

È una funzione di derivazione della chiave basata su password, ecco cosa significa PBKDF. Inserendo una password, si ottiene una chiave indietro (come byte). Ha una protezione che utilizza un salt e un numero di iterazioni, il che rende relativamente difficile calcolare la chiave (sia per te che per un utente malintenzionato). Probabilmente un hacker deve farne molti per ottenere la chiave. Tuttavia, è meglio usare SHA-256 o superiore perché richiede di eseguire il numero completo di iterazioni per qualsiasi cosa al di sopra di un output hash - e questo è probabile che sia solo un bug, non un utente malintenzionato. –

Problemi correlati