las mejores prácticas para proteger el contenido cifrado en la aplicación de Android

4

Tengo un APK de Android que se carga en archivos de contenido almacenados localmente protegidos por el cifrado AES, y quiero mantener en secreto la clave de cifrado de todos los usuarios. Solo la aplicación en sí debe poder leer la clave.

Mi pregunta es la siguiente: ¿cuál es la mejor práctica actual para evitar que todos los usuarios obtengan acceso a la clave de cifrado?

Opciones que he encontrado hasta ahora:

1) La clave de cifrado se almacena en el almacenamiento interno de la aplicación

2) La clave de cifrado está codificada de forma rígida en la aplicación en una forma muy confusa

3) La aplicación solicita la clave de cifrado a un servidor remoto que devuelve la clave de cifrado a través de SSL. La solicitud es autenticada por el servidor utilizando una clave de API que, a su vez, está codificada de forma rígida en el APK (también muy ofuscado).

Soy consciente de que el sistema operativo Android impide que las aplicaciones accedan a los datos de otras aplicaciones (cuando no están almacenadas en la tarjeta SD al menos), por lo que la clave podría almacenarse en el almacenamiento interno de la aplicación, pero no puedo confiar en esto porque los usuarios con teléfonos rooteados pueden simplemente leer todo. Así que la opción 1 está fuera.

Ninguna de las opciones restantes ofrece seguridad, solo oscuridad, y soy consciente de que codificar las claves secretas dentro de la APK es un poco de no-no.

La opción 2 al menos tiene la ventaja de ser mucho más sencilla de implementar.

La opción 3 ofrece el beneficio de la clave de cifrado que solo reside temporalmente en la memoria y nunca se almacena permanentemente en el dispositivo. Sin embargo, un atacante sin duda estaría buscando en el controlador de respuesta de la aplicación cualquier señal de la clave de cifrado. Hay eso, y la clave de la API está codificada en la aplicación, por lo que un atacante la puede descubrir.

¿Hay mejores opciones?

Editar: Con respecto al uso de claves derivadas de contraseñas: el contenido se cifra fuera de la aplicación (es decir, la aplicación nunca necesita cifrar, simplemente descifra) usando una clave predeterminada, por lo que usar una clave derivada de contraseña generada por la contraseña / PIN del usuario no funcionará como la clave resultante no coincidiría con la clave de cifrado. Además, la UX se vería afectada negativamente por este paso de contraseña adicional: queremos cargar y descifrar el contenido de forma silenciosa en segundo plano si es necesario.

    
pregunta Darriuk 15.09.2016 - 15:07
fuente

2 respuestas

2

Desea protegerlos en el entorno, que tiene más confianza que el almacenamiento de la aplicación (que puede quedar expuesto de una forma u otra).

Con frecuencia, los proveedores de sistemas operativos implementan el almacenamiento seguro de claves para tales fines. Al no saber mucho sobre Android, he escuchado que el sistema de almacén de claves de Android ( enlace ) es un almacenamiento de este tipo que puedes Se usa para proteger las claves y no se puede acceder directamente desde el país de usuarios, por mucho que pueda juzgar por los documentos, por lo que sigue sus demandas.

    
respondido por el Eugene 15.09.2016 - 16:05
fuente
1

Como CommonsWare declaró que el escenario ideal sería que la clave no se almacene en el mismo dispositivo que el hardware. Pero si su aplicación es local para el teléfono, puedo entender por qué quiere evitar esto.

Una forma de proteger los datos es que la clave se derive de una contraseña / PIN ingresada por el usuario y, por lo tanto, no se almacena en absoluto. Si se ingresa la contraseña de usuario incorrecta, los datos simplemente no se descifran. Puede ofuscarlo aún más almacenándolo en un blob. Dependiendo del tipo de aplicación, esto puede estar bien, pero para algunas aplicaciones sería un problema grave con la experiencia del usuario si tuvieran que ingresar una contraseña / PIN cada vez.

    
respondido por el Prediluted 15.09.2016 - 16:02
fuente

Lea otras preguntas en las etiquetas