2012-03-01 13 views
10

Ho bisogno di memorizzare dati sensibili in un database SQLite in un'app Android.Android - Memorizzazione di dati sensibili nel database sqlite

Come posso essere sicuro che questi dati siano molto sicuri? So che posso crittografare i dati usando una chiave, ma dove posso conservare quella chiave? Non voglio chiedere all'utente di inserire una chiave, voglio solo che funzioni su di essa. Poiché temo il reverse engineering, non voglio inserire nemmeno una chiave di crittografia nel codice.

Ho scoperto circa SQLCipher. Dice che è un modo molto sicuro di crittografare i dati nel database, ma perché è così? Non devo anche tenere una chiave per sbloccare quell'informazione? O è davvero un modo perfetto per assicurarsi che i dati siano sicuri?

E se non lo è, cosa è un modo (quasi) a prova di errore di memorizzare dati sensibili in un database SQLite?

risposta

8

La crittografia simmetrica richiede una chiave per crittografare e la stessa chiave per decodificare. Non c'è modo di aggirarlo.

Non memorizzare la chiave nel codice perché può essere decompilata (come hai detto tu).

Chiedere all'utente una password al primo utilizzo e utilizzare PBKDF2 per ottenere una chiave crittografica sicura da utilizzare nella crittografia.

O l'utente deve inserire la password o è necessario memorizzarlo nella memoria. Quello che farei è chiedere all'utente di specificare una durata in cui la chiave verrà memorizzata nella cache nella memoria da utilizzare per la decrittografia.

E se la durata è scaduta, l'utente dovrà inserire nuovamente la password.

Non ho controllato accuratamente SQLCipher ma dice che utilizza AES-256. AES è un algoritmo crittografico simmetrico e richiede una chiave per crittografare e la stessa chiave per decrittografare.

+1

Sono andato con questa soluzione, chiedo all'utente un pin ogni volta che l'applicazione viene avviata/aperta, creerò la mia chiave basata su quella e la scarterò una volta che l'applicazione viene chiusa di nuovo – Pieter888

12

Hai detto ...

Non voglio chiedere all'utente di compilare una chiave sia, voglio solo che di lavorare su di essa la propria. Poiché temo il reverse engineering I non voglio inserire neanche una chiave di crittografia nel codice.

Sfortunatamente, è necessario eseguire una di queste operazioni (beh, probabilmente). È possibile chiedere all'utente una password e quindi derivarne una chiave utilizzando un algoritmo progettato per tale scopo (noto come Crittografia basata su password - PBE - e Android include alcuni buoni standard di algoritmi PBE). È possibile memorizzare la chiave nel codice o come risorsa all'interno dell'APK, ma in tal caso qualcuno potrebbe essere in grado di eseguirne il reverse engineering. Puoi farlo e offuscare il tuo codice, che rallenterà il processo di reverse engineering, ma non puoi renderlo impossibile (il tuo codice dovrà determinare la chiave ad un certo punto, quindi è solo una questione di aggressore a capire come sta andando esso).

Altri approcci che sono stati provati qui includono forzare il client a riconnettersi a un server per recuperare la chiave attraverso la rete ... ma poi cosa succede se la connettività di rete viene interrotta e cosa impedisce al server di fornire la chiave a chiunque, come un aggressore? Bene, allora puoi usare SSL con autenticazione reciproca per assicurarti che solo il tuo cliente sia autorizzato a ottenerlo ... ma poi devi memorizzare la chiave privata SSL lato client ... che è esattamente lo stesso problema che hai ora.:)

Quindi ... la linea di fondo è che è necessaria una chiave (o qualcosa di equivalente) per crittografare/decodificare i dati. È possibile archiviarlo e rendere più difficile la decodificazione di qualcuno. Puoi scomodare l'utente e fargli digitare una password. Ma ... hai bisogno di quella conoscenza segreta in qualche modo.

+2

Ho paura che tu abbia ragione , Ho scelto di usare il metodo PBKDF2 Ranhiro Cooray menzionato, quindi sono andato con quella risposta, ma ancora eccellente risposta grazie :) – Pieter888

1

È possibile consentire alle applicazioni auto gen una password casuale? Potrebbe essere gen da luogo, tempo o altre informazioni questo non sarà necessario chiedere il pass dell'utente.

Problemi correlati