2009-12-11 12 views
10

Ho un'applicazione mobile in cui desidero memorizzare le chiavi private in modo sicuro. Il requisito di sicurezza implica che sia molto difficile per gli aggressori essere in grado di ottenere la chiave privata anche se hanno accesso illimitato al dispositivo mobile. Per raggiungere questo livello di sicurezza, l'applicazione utilizza la crittografia simmetrica con una chiave derivata da una passphrase specificata dall'utente e una salt specifica per il dispositivo.Protezione delle chiavi private dagli attacchi brute force sui dispositivi mobili

Idealmente, questo dovrebbe essere abbastanza sicuro contro un attacco di forza bruta; tuttavia vi sono due fattori limitanti:

  1. Poiché la chiave privata deve conformarsi a un certo formato, il processo di decodifica può verificare il risultato del processo per vedere se è valido o meno. Ad esempio, se la chiave privata dovesse essere una chiave privata RSA, l'utente malintenzionato proverà varie combinazioni della passphrase e test per vedere se può utilizzare il testo in chiaro risultante come una chiave privata RSA valida. Poiché la chiave privata RSA deve codificare determinate informazioni in un determinato modo, se la decrittografia non riesce, il motore RSA segnala che la chiave non è valida. Questo dà all'attaccante un modo totalmente offline di verificare i suoi attacchi. Preferibilmente, l'autore dell'attacco dovrebbe non essere in grado di dire, senza comunicare con un server, se il suo tentativo di decrittografia ha avuto successo o meno.

  2. Dal momento che l'applicazione viene eseguita su un dispositivo mobile, la maggiore complessità del Key Derivation Function non aiuta con Key Strengthening dal momento che un attacco non in linea che ha pieno accesso al dispositivo mobile dovrebbe presumibilmente essere effettuata su un dispositivo più capace con le risorse più ricche. In breve, qualsiasi aumento del numero di cicli di calcolo della funzione di derivazione della chiave rallenterebbe l'esperienza dell'utente (che è accettabile fino a un certo limite) ma sarebbe immediatamente vanificata se l'attacco dovesse essere eseguito su un computer desktop.

Qualcuno potrebbe offrirmi una soluzione a questi problemi? In particolare, qualcuno conosce un algoritmo di crittografia asimmetrico in cui la chiave privata può essere una qualsiasi sequenza di byte casuale (potrebbe essere una sequenza di lunghezza fissa, non importa) e l'algoritmo sarebbe comunque in grado di produrre testo cifrato?

+3

Sai abbastanza per essere pericoloso per te stesso. Prendi una copia della crittografia pratica e leggila dall'inizio alla fine. – rook

risposta

1

La chiave privata per RSA è una sequenza di byte casuale a lunghezza fissa. Hai appena visto una codifica ASCII di esso. Basta memorizzare la chiave in un formato non ASCII e dovresti essere bravo.

+1

A meno che la chiave pubblica non sia pubblica ... –

+0

Ne sei sicuro? La chiave privata RSA non codifica un numero composito molto lungo, insieme ai suoi fattori principali (so che sto facendo un semplice digito, ma i dettagli esatti non sono importanti)? Se lo fa, il risultato è tutt'altro che casuale poiché le parti devono essere coerenti tra loro (cioè i fattori primi dovrebbero moltiplicarsi per dare il numero composito). – paracycle

+0

Hai ragione, non è * totalmente * casuale, alcuni bit dipenderanno dagli altri. Ma questo non dovrebbe essere un problema reale fino a quando ci saranno abbastanza bit indipendenti (e per una chiave privata che dovrebbe essere abbastanza grande - sono abbastanza sicuro che non memorizzino sia i numeri composti che i fattori primi, poiché puoi calcolare triviamente il primo moltiplicando gli ultimi). – Wim

5

Il requisito di sicurezza implica che sia molto difficile per gli utenti malintenzionati essere in grado di ottenere la chiave privata anche se hanno accesso illimitato al dispositivo mobile.

Questo è solo non possibile.

Ecco cosa un utente malintenzionato può fare:

  1. Ottenere l'applicazione in uno stato in cui la chiave privata deve essere caricato in memoria . L'uso regolare dell'applicazione causerà questo.
  2. Scarica il contenuto della memoria.
  3. Far scorrere i bit di memoria provando tutti gli intervalli della lunghezza della chiave nota.

Dal momento che la chiave è in memoria, non importa quale schema intelligente è venuto fuori per generarlo da pass-frasi e sali. La tua applicazione fa tutto il lavoro per l'aggressore. Caso classico di errore security through obscurity.

Questo è il modo in Blu-Ray è stato inizialmente incrinato. Se l'utente ha pieno accesso a un dump della memoria durante l'utilizzo dell'applicazione, non c'è modo di impedire che ottengano la chiave in questo modo.

Benvenuti nel mondo dei DRM.

+2

Grazie per la risposta rapida. Sono a conoscenza del vettore di attacco di cui stai parlando e conosco la storia di come il primo HD-DVD e poi il BluRay siano stati incrinati. Tuttavia, questo è stato il motivo per cui ho detto ** molto difficile ** e non impossibile. L'attacco che descrivi è molto semplice da eseguire per un dispositivo mobile, tuttavia, un modo più semplice per l'utente malintenzionato è quello di ottenere un dump della memoria e lavorare su quello invece del dispositivo stesso. Questo è il problema che sto cercando di risolvere, forse non ero chiaro come avrei dovuto. Puoi aiutarmi con quello? – paracycle

+0

La protezione contro l'adulterazione di un dispositivo è difficile. Ragionevolmente la protezione dai furti non è così difficile. –

+0

Stai sviluppando per iPhone/Android per caso? Esistono simulatori di software per queste cose (e probabilmente per la maggior parte delle altre piattaforme popolari), il che rende piuttosto banale ottenere un dump della memoria della tua applicazione in esecuzione ... – Wim

2

moderni algoritmi simmetrici sono molto resistenti agli attacchi in chiaro noti. Dove sono stati scoperti gli attacchi, possono richiedere molti testi in chiaro e talvolta i testi in chiaro devono essere selezionati in modo adattivo.

Qui, l'attaccante ha un unico, chiaro parziale. Immagino che il carico di lavoro sia essenzialmente una ricerca di forza bruta nello spazio chiave. Se la chiave simmetrica viene scelta casualmente dall'intero spazio delle chiavi, non è possibile per un utente malintenzionato recuperare la chiave privata dal testo cifrato.

Gli attacchi indiretti sono molto più probabili.

Per esempio, qualcosa di semplice come key-logging spyware è sufficiente per sconfiggere la migliore crittografia. Potrebbero essere utilizzati anche attacchi di memoria di avvio a freddo o analisi di dump di core. Questi rischi possono essere minimizzati eliminando i segreti dalla memoria immediatamente dopo l'uso, ma non possono essere eliminati completamente.

Dal momento che la chiave in questo caso è derivato da una password selezionata dall'utente, lo spazio chiave efficace è probabile che sia molto più piccolo rispetto allo spazio chiave pieno. Mitigare ciò richiedendo password più lunghe che includono tutte le classi di caratteri. Inoltre, non scontare il rafforzamento della chiave. Le raccomandazioni abituali sono per migliaia di iterazioni della funzione di derivazione della chiave, ma anche se puoi permettertene solo poche centinaia, ciò impone un costo di calcolo significativo per un utente malintenzionato.

+0

Grazie per la risposta informata. Sei assolutamente corretto che la lunghezza/complessità della passphrase limiti notevolmente lo spazio-chiave. Tuttavia, il fatto che si tratti di un'applicazione mobile rende più difficile applicare passphrase più lunghe o più complesse, dal momento che la maggior parte degli utenti lo troverà impossibile da usare (immagina di dover inserire una passphrase alfanumerica da 10 caratteri su un dispositivo multi-tap di cui hai bisogno firmare una risposta). Uso il rafforzamento delle chiavi, ma come ho detto, se l'esperienza dell'utente sul dispositivo non viene rallentata notevolmente, il costo aggiuntivo sarà relativamente piccolo su un utente malintenzionato che lavora su un desktop. – paracycle

+0

(continua) Rimane il problema che l'autore dell'attacco sia in grado di ** verificare ** la validità del testo in chiaro decrittografato puramente offline. Affinché l'attacco a forza bruta funzioni correttamente, l'attaccante dovrebbe essere in grado di dire se il testo in chiaro è corretto o meno. Pertanto, se il testo in chiaro (chiave privata) ha uno schema (ad esempio il formato PEM) o può essere inserito in una blackbox (il motore RSA) che fallirà per un testo non valido, l'utente malintenzionato può verificare la validità della decrittografia. Quello che sto cercando è un metodo che costringerà l'attaccante a firmare qualcosa con il testo in chiaro e inviarlo al server, per convalidare il testo in chiaro. – paracycle

+0

Riassumo i commenti chiarificanti come "La chiave simmetrica è troppo piccola per proteggersi da un attacco di forza bruta". Dati i vincoli sulla dimensione e la complessità della password, ottenere 64 bit di entropia suona come un tratto. Sfortunatamente, non posso raccomandare un'alternativa che coinvolga un server. Non conosco un metodo esistente e tutto ciò che ho escogitato sembra esporre troppe informazioni mentre viaggia attraverso la rete. Continuerò a pensarci. – erickson

Problemi correlati