In che modo KeePass acquisisce padronanza della chiave per aumentare la sicurezza?

8

Non capisco come la derivazione della chiave KeePass aumenti la sicurezza della password db. Innanzitutto cercherò di spiegare cosa ho capito dalla derivazione della chiave descritta qui . Userò qualche pseudo codice:

const WORKFACTOR = 6000;

var userKey = UserEnteresPassword();
var userKeyHash = SHA256(userKey);

var randomKey = GetStoredSecureRandomKey();

var tmpKey = userKeyHash;
for(i = 0; i < WORKFACTOR; i++)
{
    tmpKey = AES(tmpKey, randomKey);
}

var finalKey = SHA256(tmpKey);

Quindi utilizza l'ultimo finalKey per crittografare il database delle password. Questo viene quindi memorizzato sul disco rigido.

Se ora voglio decifrare il database delle password, perché dovrei usare questa funzione di derivazione della chiave? Potrei semplicemente intuire il finalKey invece di indovinare userKey e farlo funzionare con questa funzione. Quindi vorrei risparmiare tutto il tempo che altrimenti avrei bisogno per questa funzione di derivazione dei tasti.

Sono consapevole che, se penso semplicemente a finalKey , non potrò ottenere userKey , ma non ne avrò bisogno visto che ho già finalKey , posso semplicemente decifrare la password db con. Non mi interessa affatto userKey .

O si tratta completamente di attacchi di dizionario per impedire a un attacco di usare parole / password passate e vedere semplicemente se il db decodifica?

    
posta GameScripting 05.09.2012 - 19:42
fonte

3 risposte

5

La derivazione della chiave è interamente quella di prendere la password dell'utente e trasformarla in una chiave lunga 256 bit per utilizzare qualunque sia la sua lunghezza e, si spera, in modo sicuro.

Se si esegue una pura forza bruta, si, si potrebbe indovinare direttamente la chiave passando in rassegna tutti i possibili pattern lunghi 256 bit, per questo si vuole essere sicuri che la derivazione della chiave non possa restringere il possibile spazio chiave in modo che tutti i 256 bit i tasti lunghi sono ancora possibilità.

Si potrebbe provare a eseguire un attacco del dizionario e passare tutte le parole del dizionario attraverso la funzione di derivazione della chiave per generare le chiavi per provare uno dei punti della derivazione della chiave è quello di renderlo abbastanza lento da non essere sensibile su un dato hardware.

Ora ci sono alcuni difetti nello pseudo-codice che hai fornito in base a un paio di funzioni (CreateSecureRandomKey () dovrebbe fornire gli stessi dati ogni volta che si apre il database per ottenere la stessa chiave da usare), io sono non sono sicuro di come dovrei esaminare la derivazione chiave in KeePass.

    
risposta data 05.09.2012 - 20:18
fonte
2

Guarda quanto è difficile eseguire la forza bruta di finalKey:

2 256 = 2 64 4

2 64 ~ = 4 * 10 9

Potresti avere quattro matrici cubiche di processori 1000x1000x1000, in esecuzione a 4 giga-indovine / sec ciascuna, per 125 anni, e le tue probabilità di indovinare sarebbe cento volte inferiore rispetto alla vincita della lotteria.

L'utilizzo di una password raw renderebbe quasi sicuramente più semplice la forza bruta. Poche persone usano qualcosa come una stringa generata casualmente di 64 cifre esadecimali (64 = 256/4) per una normale password di KeePass.

    
risposta data 10.09.2012 - 00:36
fonte
1

Questo è chiamato stretching chiave. Puoi leggere tutto su questo in l'articolo di Wikipedia .

    
risposta data 06.09.2012 - 14:27
fonte

Leggi altre domande sui tag