Diciamo che su un'app Android l'utente deve inserire un PIN di 6 cifre all'avvio. Diciamo anche che abbiamo alcuni dati sensibili in questa applicazione che vorremmo criptare.
Il modo in cui farei questo è:
- Usando una funzione di derivazione della chiave (ad esempio PBKDF2), generiamo una chiave dal PIN.
- Cifra i dati sensibili con AES usando il tasto (e una configurazione decente come CBC + padding).
- Archivia i dati crittografati ovunque, ad es. nelle preferenze condivise.
Il problema principale che vedo qui: lo spazio PIN originale per un PIN a 6 cifre è 10 ^ 6, che è ridicolmente piccolo da utilizzare come base per la crittografia ...
Possiamo davvero mettere a punto questo in modo che i dati memorizzati siano ragionevolmente sicuri per un po '?
Anche se modifichiamo il nostro KDF in modo tale che una derivazione semplice impieghi 1 secondo (non penso che possiamo aspettarci che i nostri utenti attenderanno molto più a lungo durante l'avvio dell'app), quindi il superamento di 1'000'000 di questi richiede semplicemente 11,5 giorni (assumendo la stessa potenza di elaborazione del telefono, che non è probabile ...).
Restrictions:
Obviously using a longer/stronger PIN would help - but regretfully even just a 6-digit PIN is seen as a hurdle by users, so this isn't likely an option. Also the KDF strength is limited by the amount of time we can expect the users to wait during app start, which I'd say is in the order of magnitude of 1 second.