Android – Almacenamiento de datos confidenciales en la base de datos sqlite

Necesito almacenar datos sensibles en una base de datos sqlite en una aplicación para Android.

¿Cómo puedo estar seguro de que estos datos son muy seguros? Sé que puedo cifrar los datos usando una llave, pero donde guardo esa llave? No quiero pedirle al usuario que llene una llave tampoco, solo quiero que funcione por su cuenta. Porque tengo miedo de la ingeniería inversa no quiero poner una clave de cifrado en el código tampoco.

Me enteré de SQLCipher . Se dice que es una forma muy segura de cifrar los datos en la base de datos, pero ¿por qué es así? ¿No necesito también tener una clave para desbloquear esa información? ¿O es realmente una manera perfecta de asegurarse de que los datos son seguros?

Y si no lo es , ¿cuál es una manera (casi) a prueba de fallos de almacenar datos sensibles en una base de datos sqlite?

La criptografía simétrica requiere una clave para cifrar y la misma clave para descifrar. No hay manera de evitarlo.

No almacene la clave en el código porque puede descompilarse (como usted ha dicho).

Pídale al usuario una contraseña en el primer uso y use PBKDF2 para derivar una clave criptográficamente segura para usar en el cifrado.

El usuario tiene que introducir la contraseña o necesita almacenarla en la memoria. Lo que haría es pedirle al usuario que especifique una duración en la que la clave se almacenará en caché en la memoria para usarla para descifrar.

Y si la duración ha expirado, el usuario tendrá que volver a introducir la contraseña.

No revisé SQLCipher a fondo, pero dice que usa AES-256. AES es un algoritmo criptográfico simétrico y necesita una clave para cifrar y la misma clave para descifrar.

Tu dijiste…

No quiero pedirle al usuario que llene una llave tampoco, solo quiero que funcione por su cuenta. Porque tengo miedo de la ingeniería inversa no quiero poner una clave de cifrado en el código tampoco.

Desafortunadamente, usted necesita hacer una de estas cosas (bueno, probablemente). Puede pedirle al usuario una contraseña y luego derivar una clave de la que utiliza un algoritmo diseñado para ese propósito (que se conoce como Password Based Encryption – PBE – y Android incluye algunos buenos algoritmos PBE estándar). Podría almacenar la clave en su código o como un recurso dentro de su APK, pero entonces alguien sería capaz de ingeniería inversa. Usted puede hacerlo y ofuscar su código, lo que ralentizará el proceso de ingeniería inversa, pero no se puede hacer imposible (su código tendrá que determinar la clave en algún momento por lo que es sólo una cuestión de un atacante averiguar cómo está haciendo eso).

Otros enfoques que se han intentado aquí incluyen obligar a su cliente a conectarse de nuevo a un servidor para recuperar la clave a través de la red … pero entonces lo que sucede si la conectividad de red se interrumpe y lo que impide que el servidor de dar la clave a nadie, como Un atacante Bueno, entonces podría usar mutuamente SSL autenticado para garantizar que sólo su cliente está autorizado a conseguirlo … pero entonces usted necesita para almacenar el lado del cliente SSL clave privada … que es exactamente el mismo problema que tiene ahora. 🙂

Así que … la conclusión es que se necesita una clave (o algo equivalente) para cifrar / descifrar los datos. Puede almacenarlo y hacer más difícil que alguien lo haga de ingeniería inversa. Puede incomodar al usuario y hacer que escriba una contraseña. Pero … necesitas ese conocimiento secreto de alguna manera.

¿Es posible que las aplicaciones generen automáticamente una contraseña aleatoria? Puede ser gen de información de lugar, tiempo u otros esto no será necesario pedir pase de usuario.

  • Ejemplo de búsqueda de texto completo en Android
  • Eliminar el número especificado de filas de la base de datos SQLite
  • SQL eliminar de una tabla + un jointable?
  • Base de datos de SQLite Android eliminada después de desinstalar
  • NPE intermitente al insertar datos en SQLite
  • Cómo hacer frente a múltiples cambios en la versión de la base de datos cuando se actualiza la aplicación Android
  • Cómo utilizar una base de datos existente con una aplicación de Android
  • Cómo quitar filas consecutivas con datos duplicados en ciertos campos (en SQLite)?
  • NoClassDefFoundError al usar greenDao
  • INSERTAR O IGNORAR tabla con la clave AUTOINCREMENT en Android
  • Sqlite browser: ¿dónde está el archivo db?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.