android - programa - como proteger mi celular de intervenciones
¿La mejor forma de proteger los datos confidenciales de la aplicación Android? (5)
Sí, esta es una pregunta bastante general, pero estoy intentando conocer la mejor forma de manejar una aplicación que toca base con un servidor web que distribuye datos confidenciales a la aplicación. Cualquier enlace, asesoramiento de información general, etc. sería apreciado.
Dado que la aplicación almacenaría datos persistentes recuperados de la base de datos durante un cierto período de tiempo ... todo se torna algo delicado.
Almacenar datos confidenciales en el dispositivo
Eso depende mucho de tu audiencia. Normalmente, el sistema operativo Android prohíbe que las aplicaciones accedan a los archivos de los demás (es decir, bases de datos, archivos de preferencias, archivos comunes almacenados en el directorio privado de la aplicación) a través de permisos de archivos de Linux comprobados. Sin embargo, en dispositivos rooteados, una aplicación puede obtener acceso a la raíz y leer todo. Algunas cosas para pensar:
- Si sabe que sus usuarios no tendrán root (por ejemplo, si no está distribuyendo la aplicación a través de Android Market, sino solo en su empresa, o algo así), simplemente puede confiar en la seguridad del sistema de archivos de Android.
- Si un usuario obtiene acceso de root, tendrá mucho cuidado con la aplicación que le da ese privilegio a
- Si una aplicación obtiene acceso a la raíz, puede causar muchos estragos. La información en su aplicación podría ser la menor de las preocupaciones del usuario.
- Enraizamiento conduce a garantía cero. Incluyendo en aplicaciones. No puede hacerse responsable de la filtración de información en un teléfono rooteado.
Para concluir, si su información no es extremadamente sensible (por ejemplo, información de tarjeta de crédito), le sugiero que se quede con la seguridad predeterminada proporcionada por Android (es decir, guarde todo en texto sin formato, sabiendo que otras aplicaciones no pueden acceder a él).
De lo contrario, la encriptación es el camino a seguir. No es 100% seguro (un hacker podría descompilar su aplicación y descubrir cómo descifrar los datos), pero es un gran problema para crackear y detendrá a la mayoría de los piratas informáticos. Especialmente si ofuscas tu código con algo como ProGuard .
Transferencia de datos confidenciales del servidor al dispositivo
Tienes algunas opciones aquí. En primer lugar, siempre use HTTPS. Después de habilitar HTTPS, aquí hay dos medidas de seguridad adicionales que propondría:
- Use un sistema de clave API. Incluya esta clave de API en todas sus solicitudes y revísela en el lado del servidor antes de devolver cualquier respuesta. Recuerde que, dado que está utilizando HTTPS, un atacante no podría simplemente usar un rastreador de red para averiguar su clave de API. Sin embargo, esto es bastante fácil de averiguar si alguien descompila tu aplicación, por lo que puedes ofuscarla aún más (además de usar ProGuard). Por ejemplo, puede mantener la clave API dividida en partes alrededor de su código (por ejemplo, como miembros estáticos en dos o tres clases). Luego, cuando envía una solicitud, simplemente concatena todas esas piezas. Incluso puede aplicar algún otro tipo de transformación (por ejemplo, cambio de bit) para que sea aún más difícil de descifrar a partir del código descompilado.
- Puede generar una clave cada vez que envíe una solicitud. Esa clave se generaría utilizando un poco de lógica que solo usted conoce, para que pueda implementarla también en el lado del cliente y del servidor. Por ejemplo, una solicitud podría incluir los siguientes parámetros:
time=1321802432&key=[generated-key]
dondegenerated-key
se genera a partir del parámetro detime
. Por ejemplo:md5(time + salt)
. Cuando el servidor recibe esta solicitud, puede hacer dos cosas:- Verifique que la
key
sea de hecho igual amd5(time + salt)
(tenga en cuenta que solo el cliente y el servidor conocen la sal y se puede ofuscar de manera similar a la clave API anterior), y - Verifique que el
time
no esté muy atrás en el pasado (por ejemplo, si es más de 1-2 minutos en el pasado, considere la solicitud inválida).
- Verifique que la
El segundo método es más útil si también está haciendo solicitudes HTTP simples, donde todos pueden ver los parámetros que se envían. Además, es mucho más difícil descifrar el código descompilado. Especialmente si extiende la lógica de cálculo de tecla a través de múltiples clases.
Sin embargo , tenga en cuenta que nada hace que sea imposible descifrar su aplicación. Puedes ofuscar tanto como quieras, si un hacker está realmente decidido a acceder a tus datos, podrá descompilar tu aplicación y pasar muchas noches sin dormir pasando por tu código y averiguando cómo se forman las solicitudes. La única manera real de proteger sus datos es pidiéndole una contraseña a su usuario, además de hacer todo el trabajo que escribí anteriormente. No puede obtener una contraseña que solo existe en el encabezado de alguien (el usuario) desde el código decompilado :).
(Vine aquí gracias a una búsqueda en Google)
He estado investigando esto mucho últimamente y esta página ha surgido mucho gracias a las búsquedas de Google y Bing. El procedimiento ampliamente aceptado para almacenar datos en el dispositivo de forma segura ha sido utilizar un fuerte algoritmo de encriptación como AES. La pregunta más difícil es "AES requiere una clave segura. ¿Qué haces con la llave?"
Google anunció recientemente una solución de almacenamiento basada en la nube para aplicaciones, por lo que podría considerar almacenar la clave allí si la situación lo permite. De lo contrario, parece que obtener la clave fuera del dispositivo, como en un servidor, es mejor. Si puede hacer que el usuario introduzca un PIN, en realidad funcionaría mejor. Puede hacer una derivación de contraseña para almacenar la contraseña, y puede volver a hacer la derivación para verificar la contraseña
Sin la parte "usuario perforando un PIN", no he encontrado muchas respuestas buenas a esa pregunta. Sin embargo, NO HAGA CLAVE DIFÍCIL LA CLAVE SI DEBE ALMACENAR UNA CON LA APLICACIÓN. Como mínimo, genere una clave utilizando un generador de contraseñas seguro y / o una función de derivación como PBKDF2 (función de derivación basada en contraseña 2).
Si leo las publicaciones correctamente, Google dijo que un enfoque es generar una clave una vez que la aplicación se inicia por primera vez, almacenar la clave a través del indicador MODE_PRIVATE en una gran cantidad de operaciones de E / S de archivos, y usar eso como la clave. También puede derivar otras claves basadas en esa clave maestra, y el NIST realmente sugiere algo en esa línea.
Si confío o no en el método de la clave maestra, lo dejo a usted. Esta clave quedaría expuesta en un dispositivo rooteado. También admitiré que todavía estoy investigando el problema
Si desea asegurarse de que el usuario no puede ver los datos de otra forma que mirando su aplicación, entonces el cifrado es realmente la única manera. Incluso el almacenamiento "protegido" es accesible para el usuario si un dispositivo está rooteado. Incluso el cifrado no es totalmente seguro, ya que necesita descifrar los datos en algún momento para poder mostrarlos. Disuadirás al navegador ocasional pero no al hacker determinado.
Todas las aplicaciones en Android se ejecutan en un entorno seguro de espacio aislado, por lo que otros procesos en el sistema no pueden acceder a su código o datos privados sin un apretón de manos adecuado. Pero aún hay muchas vulnerabilidades posibles por un diseño deficiente de las aplicaciones. Este enlace del sitio de desarrolladores de Android te aconseja algunos de los buenos consejos para la seguridad: developer.android.com/training/articles/security-tips.html
Use SSL en HTTPS para transferir datos en lugar de HTTP, necesita configurar los certificados en el servidor web, sin estar muy seguros de cómo funciona.
Si realmente le preocupan los datos, enméjelos con un algoritmo único antes de enviarlos y descifrarlos cuando llegue a la aplicación. Supongo que todo se trata. A menos que necesites algo realmente fuerte, desarrolla tu propio protocolo basado en TCP y / o usa otro puerto ... quizás eso ayude.
http://en.wikipedia.org/wiki/Secure_Sockets_Layer http://developer.android.com/reference/javax/net/ssl/package-summary.html http://blog.synyx.de/2010/06/android-and-self-signed-ssl-certificates/
En cuanto al almacenamiento de datos en la aplicación, puede cifrar los datos antes de almacenarlos o puede usar otro formato que no sea SQLite para una mayor seguridad, ya que puede ver las bases de datos de sqlite usando el navegador con bastante facilidad.
A menos que el teléfono esté rooteado, no debería haber una forma de extraer los datos de él.