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?