Situazione: all'interno di un'applicazione , stiamo generando e archiviando una chiave privata (RSA o ECC) che usiamo per firmare varie richieste con (per autenticare usando il cellulare come secondo fattore, o per firmare le transazioni).
Ora vogliamo archiviare in modo sicuro la chiave privata sul dispositivo mobile , protetta con PIN (e altre).
Abbiamo una situazione simile in cui memorizziamo i token bearer OAuth2 (token di aggiornamento), qui usiamo la derivazione della chiave per crittografare i token utilizzando il PIN inserito dall'utente. Per un PIN a 6 cifre, ci sono 1'000'000 risultati possibili quando si decodificano i token, di cui solo uno è il token corretto. Un utente malintenzionato non può eseguire un attacco bruteforce offline, poiché il token deve essere inviato al server per verificare se è corretto (e bloccheremo il dispositivo dopo ~ 3 tentativi falliti).
Quando si utilizza lo stesso meccanismo per crittografare una chiave RSA (si riduce a un numero primo ) utilizzando un PIN, otteniamo 1'000'000 possibili risultati per un PIN a 6 cifre, solo che questa volta alcuni risultati possono essere facilmente esclusi perché non sono primi.
Un test ha dimostrato che ~ 99,7% di tali risultati può essere facilmente definito come primo , lasciandoci con circa lo 0,3% dei possibili risultati che sono probabili prime. Un utente malintenzionato può ora ridurre rapidamente il numero di possibili PIN da un milione a circa 3'000.
Domande:
- Si tratta di un problema noto (crittografia dei numeri primi), ed esiste una soluzione ben nota (non è stato possibile trovare qualcosa di utile su google).
- Dovremmo dimenticare le chiavi RSA e utilizzare invece i tasti ECC (curva ellittica) e una chiave privata ECC può essere memorizzata in modo sicuro senza scartare i risultati errati durante la decrittografia con il PIN sbagliato?