Derivazione e memorizzazione di una chiave AES per SQLite DB su iOS

4

Ho letto su vari Q & A qui su come gestire la crittografia di un database SQLite locale su iOS, e da quello che ho visto, praticamente tutti sono d'accordo sul fatto che sia brutto, idea BAD di memorizzare la chiave di crittografia nel codice. Quindi, ho deciso di non farlo.

Ora, un'altra opzione più sicura che mi è piaciuta è quella di inviare la chiave di crittografia dal server su TLS e utilizzare il blocco dei certificati per impedire agli utenti di MITM. Sfortunatamente, questo crea problemi per la mia situazione, dal momento che l'app che sto costruendo deve essere completamente funzionale senza una connessione Internet.

Una terza opzione che non ho visto è un metodo di sicurezza più elaborato attraverso l'oscurità (vale a dire, più oscuro che nascondere la password in chiaro nell'app). Ecco alcune opzioni che mi sono divertito (ma mi sembrano tutte in qualche modo discutibili):

  1. Utilizza un valore sconosciuto, ma non percettibile (come il tempo trascorso per il completamento di una determinata richiesta API o le coordinate che l'utente tocca su uno schermo) per ricavare la chiave.
  2. Fai in modo che l'utente dell'app inserisca una passphrase distinta quando i dati vengono scaricati per la prima volta e ne ricava la chiave.

So che le best practice dettano l'eliminazione della chiave derivata (stavo pensando di utilizzare PBKDF2) e di mantenere il numero di round + di sale in giro. Tuttavia , non voglio chiedere all'utente la frase password più di una volta (per farla breve, la forniranno solo dopo aver "autenticato" il loro dispositivo, che deve solo succedere una volta ).

Di conseguenza, penso che avrei bisogno di memorizzare la chiave localmente, in formato testo (o nel portachiavi, ma cosa farebbe davvero?) O memorizzare la frase password (da 1 o 2 sopra), sale e colpi. L'app manipolerebbe quindi la frase password prima di inserirla nella funzione di derivazione della chiave. Questo sembra preferibile, dal momento che la memorizzazione della chiave derivata annulla totalmente la sicurezza.

Quindi, cosa voglio sapere. È così stupido? Qualcuno sarà in grado di decodificare questo in un pomeriggio? O sarebbe difficile capire come l'app sta manipolando la chiave prima di inserirla nella funzione di derivazione della chiave?

    
posta Dan Loewenherz 17.08.2016 - 04:14
fonte

1 risposta

2

Inseriscilo nel portachiavi. Questo è esattamente ciò per cui è lì. Ciò che fa è crittografare le chiavi quando non vengono utilizzate dalla tua app e limitarne l'accesso alla sola app.

È sufficiente fare in modo che l'applicazione generi in modo sicuro una nuova chiave casuale al primo utilizzo e memorizzarla nel portachiavi per riutilizzarla nei successivi lanci dell'applicazione. In questo modo stai utilizzando sistemi progettati per questi scopi, ogni dispositivo ha una chiave unica ad alta entropia e non sei limitato dalle debolezze intrinseche dei sistemi di basi di password o dalle insidie di roll-your-own-key- meccanismi di stoccaggio.

    
risposta data 23.08.2016 - 19:18
fonte

Leggi altre domande sui tag