¿La mejor forma de proteger datos sensibles a aplicaciones de Android?

Sí, esta es una pregunta bastante general, pero estoy tratando de obtener una idea de la mejor manera de manejar una aplicación que toca base w / un servidor web que distribuye datos sensibles a la aplicación. Cualquier acoplamiento, consejo general de la información etc. sería apreciado.

Dado que la aplicación almacenaría datos persistentes recuperados de la base de datos durante cierto tiempo .. todo se vuelve algo sensible.

Almacenamiento de datos confidenciales en el dispositivo

Eso depende mucho de su audiencia. Normalmente, el sistema operativo Android prohíbe que las aplicaciones accedan a los archivos de cada uno (por ejemplo, bases de datos, archivos de preferencias, archivos regulares almacenados en el directorio privado de la aplicación) a través de los probados permisos de archivos de Linux. Sin embargo, en dispositivos enraizados, una aplicación puede obtener acceso root y leer todo. Algunas cosas para pensar:

  1. Si sabes que tus usuarios no tendrán root (por ejemplo, si no distribuyes la aplicación a través de Android Market, sino sólo en tu empresa o algo así), puedes confiar en la seguridad basada en el sistema de archivos de Android.
  2. Si un usuario obtiene acceso root, será muy cuidadoso con la aplicación que le da ese privilegio a
  3. Si una aplicación obtiene acceso root, puede causar mucho estrago. La información de su aplicación podría ser la menor de las preocupaciones del usuario.
  4. El enraizamiento conduce a la garantía cero. Incluyendo en aplicaciones. No se puede responsabilizar por la filtración de información en un teléfono enraizado.

Para concluir, si su información no es super-duper sensible (por ejemplo, información de tarjeta de crédito), sugeriría sólo pegarse con la seguridad predeterminada proporcionada por Android (es decir, guardar todo en texto plano, sabiendo que otras aplicaciones no pueden acceder a él).

De lo contrario, el cifrado es el camino a seguir. No es 100% seguro (un hacker podría descompilar su aplicación y averiguar cómo descifrar los datos), pero es un gran dolor para romper y detendrá a la mayoría de los hackers. Especialmente si obfuscate su código con algo como ProGuard .


Transferencia de datos confidenciales desde el servidor al dispositivo

Usted tiene algunas opciones aquí. En primer lugar, siempre utilice HTTPS. Después de habilitar HTTPS, he aquí dos medidas de seguridad adicionales que propongo:

  1. Utilice un sistema de clave API. Incluya esta clave de API en todas sus solicitudes y compruebe en el lado del servidor antes de enviar cualquier respuesta. Recuerde que desde que está usando HTTPS, un atacante no podría 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 ocultarla aún más (además de usar ProGuard). Por ejemplo, puede mantener la clave de API dividida en partes alrededor de su código (por ejemplo como miembros estáticos en dos o tres clases). Luego, cuando envíe una solicitud, simplemente concatene todas esas piezas. Incluso puede aplicar algún otro tipo de transformación (por ejemplo, desplazamiento de bits) para que sea aún más difícil de averiguar a partir del código descompilado.
  2. Puede generar una clave cada vez que envíe una solicitud. Esa clave se generaría mediante el uso de un poco de lógica que sólo usted sabe, para que pueda implementar el cliente y el lado del servidor también. Por ejemplo, una solicitud podría incluir los siguientes parámetros:
    time=1321802432&key=[generated-key]
    Donde generated-key generada se genera a partir del parámetro time . Por ejemplo: md5(time + salt) . Cuando el servidor recibe esta solicitud, puede hacer dos cosas:
    1. Compruebe que la key es realmente igual a md5(time + salt) (tenga en cuenta que sólo el cliente y el servidor conocen la sal y puede ser ofuscada de forma similar a la clave de API anterior), y
    2. Compruebe que el time no está demasiado atrás en el pasado (por ejemplo, si es más de 1-2 minutos en el pasado, considere la solicitud no válida).

El segundo método es más útil si también está haciendo simples solicitudes HTTP, donde todos pueden ver los parámetros que se envían. Además, es mucho más difícil de averiguar de código descompilado. Especialmente si se extiende la lógica de cálculo clave a través de varias clases.

Sin embargo , tenga en cuenta que nada hace que sea imposible romper su aplicación. Puedes ofuscar tanto como quieras, si un hacker está realmente decidido a llegar a tus datos, él podrá hacerlo descompilando tu aplicación y pasando muchas noches sin dormir pasando a través de tu código y averiguando cómo se forman las solicitudes. La única manera real de asegurar sus datos es preguntar a su usuario para una contraseña, además de hacer todo el trabajo que escribí sobre arriba. No se puede obtener una contraseña que sólo existe en la cabeza de alguien (el usuario) del código descompilado :).

(Vino aquí gracias a una búsqueda de Google)

He estado investigando esto mucho últimamente y esta página ha subido mucho gracias a las búsquedas Google y Bing. El procedimiento ampliamente aceptado para almacenar datos en el dispositivo de forma segura ha sido utilizar un algoritmo de cifrado fuerte como AES. La pregunta más difícil es "AES requiere una clave segura ¿Qué haces con la clave?"

Google anunció recientemente una solución de almacenamiento basada en la nube para aplicaciones, por lo que podría considerar almacenar la llave allí si la situación lo permite. De lo contrario, parece que conseguir la clave fuera del dispositivo, como en un servidor, es mejor. Si usted puede hacer que el usuario pinche en un PIN, que realmente funciona mejor. Puede realizar 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 el "usuario de perforación en un PIN" parte, no he encontrado un montón de buenas respuestas a esa pregunta. Sin embargo, NO HARD-CÓDIGO LA LLAVE SI TIENES QUE ALMACENAR UNA CON LA APP. Como mínimo, genere una clave utilizando un generador de contraseñas seguras y / o una función de derivación como PBKDF2 (función de derivación basada en contraseña 2).

Si he leído las publicaciones correctamente, Google dijo que un enfoque es generar una clave una vez que la aplicación se inicia la primera vez, almacenar la clave a través del indicador MODE_PRIVATE a una gran cantidad de operaciones de E / S de archivos, y utilizarlo como la clave. También puede derivar otras claves basadas en esa clave maestra, y el NIST sugiere algo en ese sentido.

Si confiar o no en el método de clave maestra, lo dejaré. Esta clave quedaría expuesta en un dispositivo con raíz. También voy a admitir que todavía estoy investigando el tema

Utilice SSL en HTTPS para transferir datos en lugar de HTTP que necesita para configurar los certificados en el servidor web no muy seguro de cómo funciona.

Si usted está realmente preocupado por los datos, luego encriptarlo con un algoritmo único antes de enviarlo y desencriptarlo cuando llegue a la aplicación. Supongo que eso es todo .. A menos que necesite algo realmente fuerte, a continuación, desarrollar su propio protocolo basado en TCP y / o utilizar otro puerto .. tal vez eso va a ayudar

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-certificados /

En cuanto a almacenar datos en la aplicación de lo que puede cifrar los datos antes de almacenar o puede utilizar otro formato distinto de SQLite para una mejor seguridad como se puede ver bases de datos sqlite utilizando el navegador con bastante facilidad.

A menos que el teléfono esté enraizado no debería haber una manera de extraer los datos de ella.

Si desea asegurarse de que el usuario no puede ver los datos aparte de mirar su aplicación, entonces el cifrado es realmente la única manera. Incluso el almacenamiento "protegido" es accesible al usuario si un dispositivo está enraizado. Incluso la encriptación no es totalmente segura, ya que necesita descifrar los datos en algún momento para poder mostrarlos. Usted disuadirá al navegador casual, pero no al hacker determinado.

  • Conexión a un servicio web desde una aplicación de Android con seguridad
  • La aplicación de Android no debe ejecutarse en dispositivos con raíces
  • ¿Cuál es la forma más segura de autorizar a un usuario en Android?
  • ¿Es el intercambio de archivos Bluetooth completamente seguro?
  • SetStorageEncryption no produce ningún efecto
  • Cómo agregar PBKDF2WithHmacSHA1 para android api 8 (Froyo)
  • Android anti-crack, vale la pena de todos modos?
  • ¿Cómo cambiar la instantánea mostrada por la lista de aplicaciones recientes?
  • En seguridad de facturación de aplicaciones
  • Lee la huella digital de la computadora RSA desde Android
  • Android - después de cargar URL con webview puedo cambiar el color de fondo
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.