PBKDF2 utilizzato per generare una chiave di crittografia: lungo segreto condiviso (password) vs conteggio iterazioni

2

Voglio utilizzare pbkdf2 per generare una chiave per un algoritmo di crittografia simmetrica (DES, 3DES, potrebbe essere AES), che verrà utilizzato per proteggere i dati privati tra un AS / 400 e un altro computer (probabilmente con Windows).

Ho "trasferito" il codice sorgente di pbkdf2 da un repository di FreeBSD a un AS / 400 (AKA come sistema iSeries o Power), che non è un grosso problema per BTW.

Ho anche compilato lo stesso codice su un sistema Windows (con Visual Studio 2012) (Per coloro che potrebbero essere interessati, esiste un'API che implementa PBKDF2 in Windows 7 e Win2008R2: BCryptDeriveKeyPBKDF2 ())

Le prestazioni sembrano abbastanza buone su Windows (ammetto che la macchina Windows non è una "macchina lenta" al momento della scrittura: Asus R751L, Intel Core i7-4500U, ram da 16 GB): Con password="abcd", salt="some salt" (userò un valore casuale a 64 bit o più se richiesto nell'applicazione reale), qui ci sono alcune volte per più conteggio iterazioni (c):

  • c = 1000 = > 31ms (non ottimizzato), 15ms (ottimizzato per la velocità)
  • c = 10000 = > 320 ms (non ottimizzato), 94 ms (ottimizzato per la velocità)
  • c = 100000 = > 3280 ms (non ottimizzato), 880 ms (ottimizzato per la velocità)

(FYI, l'API BCryptDeriveKeyPBKDF2 () fornisce risultati leggermente migliori rispetto alla versione che ho compilato, ma questo non è il mio problema)

Ora il problema è la velocità di esecuzione che ottengo con il sistema AS / 400:

  • c = 1000 = > 12590 ms (non ottimizzato), 2946 ms (ottimizzato)
  • c = 10000 = > 125889ms (non ottimizzato), 29452ms (ottimizzato)
  • c = 100000 = > (non ho provato ...)

Il mio AS / 400 non è un sistema molto potente, ma anche la versione ottimizzata è molto lenta ...

Fino ad ora, ho letto che il parametro "c" (numero di iterazioni) dovrebbe essere il più alto possibile, 1000 è il valore minimo raccomandato per "c" negli anni 2000 ... e che bisogna trovare un compromesso tra prestazioni accettabili e sicurezza, secondo i sistemi coinvolti; nel mio caso, c = 1000 richiede già troppo tempo per essere calcolato a mio parere, per diversi motivi:

  • Reponsività dell'applicazione,
  • possibili attacchi DOS,
  • ...

Ora mi chiedo: può un segreto condiviso lungo e / o complicato essere una soluzione per mantenere "c" il più piccolo possibile senza "perdere" troppa "sicurezza"? (1000 per "c" è già troppo lento, quindi mi piacerebbe usare c = 100 potrebbe essere ...)

Esiste qualche tipo di regola, ad esempio "l'aggiunta di n caratteri alla password è in qualche modo equivalente aumentando il numero di iterazioni (c) di x?

Aumentando la dimensione del sale (ad es. 128 bit o più invece di 64 bit) aumenta la difficoltà a tornare ai dati originali per un cracker?

    
posta ggo 28.09.2014 - 11:31
fonte

3 risposte

1

La linea di macchine AS / 400 ha una lunga storia. Normalmente usano la CPU della famiglia PowerPC / POWER, ma i primi modelli sono iniziati con CPU con clock a 55 MHz, che non si può pretendere di essere veloci ... Ciò potrebbe spiegare le pessime prestazioni che si ottengono. O forse c'era qualche problema sottile nel tuo processo di porting. Ad esempio, lo srotolamento del loop aggressivo può far sì che un codice di funzione superi la cache L1, il che può uccidere le prestazioni in grande tempo (ho già assistito a un rallentamento di 50 volte per tali casi).

In ogni caso, le iterazioni in PBKDF2 sono pensate per compensare l'entropia relativamente bassa della password di input (perché la password è una password , adatta a un cervello umano). Se riesci a far sì che la password abbia un'alta entropia, otterrai sicurezza con un conteggio iterato basso.

(Ricorda che l'entropia non è la lunghezza. Entropia è casualità .)

    
risposta data 29.10.2014 - 12:29
fonte
0

Come dice il nome, una chiave di derivazione basata su password (PBKDF) viene utilizzata per ottenere una chiave di crittografia da una password . Le password sono generalmente brevi (bassa entropia) e la forzatura bruta può essere eseguita in tempi ragionevoli. Il PBKDF quindi ostacolerà la forzatura bruta usando un sacco di tempo per ipotesi.

Sembra che tu abbia il controllo sulla chiave (non l'utente sta scegliendo una password), in questo caso è sicuro fare a meno del PBKDF e usare direttamente la chiave segreta. Se il tuo algoritmo, ad es. si aspetta una chiave di 32 byte, questa chiave ha un'alta entropia e non può essere forzata bruta in tempi ragionevoli. Tieni presente che quei 32 byte non sono un testo alfanumerico, ma è come un array di 32 byte casuali.

EDIT:

Dal tuo commento vedo che è davvero una password, quindi il PBKDF è la strada giusta da percorrere. In realtà è corretto che una lunga password (una password con un'alta entropia) consentirebbe di diminuire il fattore di costo, anche se la difficoltà è quella di garantire che l'utente scelga davvero una password così strong. Le solite regole non sono un buon indicatore, perché una password come Password2014 o proverbi noti riempie la maggior parte delle regole, ma non sono password sicure. Una via d'uscita sarebbe che l'applicazione genera autonomamente password complesse e accetta solo password di questo modulo.

    
risposta data 28.09.2014 - 15:36
fonte
0

Is there some kind of rule, like "adding n characters to the password is somewhat equivalent increasing the number of iterations (c) of x?

Il compromesso tra forza della password e conteggio delle iterazioni è id: log, dove id è l'identità e log è il logaritmo. Quindi 1000 iterazioni significherebbero circa 10 bit di forza aggiuntiva per la password. Un milione di iterazioni significherebbe 20 bit aggiuntivi. Tuttavia, non esiste una strong relazione 1: 1 tra il numero di caratteri di una password e la sua forza in bit, solo per le password veramente casuali.

PBKDF è una pessima soluzione per un problema che altrimenti sarebbe anche peggio. Aggiunge solo logaritmicamente alla forza. Di solito PBDKF non crea questo carico generale in quanto anche per i servizi di grandi dimensioni il numero di persone che accedono per un dato momento è piccolo rispetto al numero di utenti totali. Ma nel tuo caso si applica chiaramente il problema di carico PBDKF.

    
risposta data 29.10.2014 - 12:23
fonte

Leggi altre domande sui tag