He leído varias preguntas y respuestas aquí sobre cómo administrar el cifrado de una base de datos SQLite local en iOS, y por lo que he visto, casi todo el mundo está de acuerdo en que es una mala idea, mala idea almacenar la clave de cifrado en codigo. Entonces, decidí no hacer eso.
Ahora, otra opción más segura que me gustó es enviar la clave de cifrado desde el servidor a través de TLS, y usar la fijación de certificados para ayudar a evitar que las personas realicen MITM. Desafortunadamente, esto crea problemas para mi situación, ya que la aplicación que estoy creando debe ser completamente funcional sin conexión a Internet.
Una tercera opción que no he visto es un método de seguridad más elaborado a través de la oscuridad (es decir, más oscuro que ocultar la contraseña en texto sin formato en la aplicación). Aquí hay algunas opciones que he estado entreteniendo (pero todas me parecen cuestionables):
- Use un valor desconocido, pero no presumible (como el tiempo transcurrido para que una determinada solicitud de API finalice, o las coordenadas que el usuario toca en una pantalla) para derivar la clave.
- Haga que el usuario de la aplicación ingrese una contraseña distinta cuando se descarguen los datos por primera vez, y obtenga la clave a partir de eso.
Sé que las mejores prácticas requieren la eliminación de la clave derivada (estaba planeando usar PBKDF2) y mantener la sal + el número de rondas alrededor. Sin embargo , no quiero pedirle al usuario la frase de contraseña más de una vez (cuento, no lo proporcionarán después de que "autentifiquen" su dispositivo, que solo debe suceder una vez ).
Como resultado, creo que necesitaría almacenar la clave localmente, en texto simple (o en el llavero, pero ¿qué haría eso realmente?) O almacenar la frase de contraseña (de 1 o 2 arriba), sal, y rondas. La aplicación luego manipularía la frase de contraseña antes de introducirla en la función de derivación de claves. Esto parece muy preferible, ya que el almacenamiento de la clave derivada deshace totalmente toda la seguridad.
Entonces, lo que quiero saber. ¿Esto es tonto? ¿Alguien determinado podrá hacer ingeniería inversa en una tarde? ¿O sería difícil entender cómo la aplicación está manipulando la clave antes de introducirla en la función de derivación de claves?