Android provee varias funcionalidades que ayudan a crear aplicaciones seguras:
-
Android Application Sandbox: aísla las aplicaciones y la ejecución de código de otras aplicaciones.
-
Framework de desarrollo para Android: proporciona funcionalidades como criptografía, permisos, etc.
-
El sistema de archivos puede ser encriptado.
-
Se puede restringir el acceso de usuarios a los datos de usuario y a algunas funcionalidades del sistema.
-
Existen permisos predefinidos para manejar los datos.
Consejos para crear apps Android seguras
Seguridad de datos almacenados en Android
La información almacenada en los dispositivos móviles es lo más valioso, por lo que se debe dar especial importancia a cómo las aplicaciones acceden a los datos. Existen tres formas de almacenar datos en un dispositivo:
-
Usando memoria interna: por defecto los archivos creados son accesibles únicamente por su aplicación. Esto se consigue por la funcionalidad propia de Android y suele ser suficiente. Para seguridad adicional se puede encriptar la información utilizando claves no almacenadas en el dispositivo.
-
Usando memoria externa: por ejemplo tarjetas SD. Los archivos aquí creados son leíbles y editables por cualquier aplicación. Se recomienda no almacenar ejecutables en memoria externa y si se almacenan que estén encriptados y firmados.
-
Usando proveedores de contenido: ofrecen un mecanismo de almacenamiento estructurado para que una aplicación provea de datos a otras aplicaciones.
Permisos de aplicaciones Android
Debido al aislamiento de las aplicaciones, estas deben definir explicitamente sus recursos y datos compartidos.
Solicitando permisos
Se recomienda reducir al máximo el número de permisos que la aplicación va a requerir ya que si no se tiene acceso a información sensible innecesaria se consigue que la aplicación sea menos vulnerable a posibles ataques.
Se recomienda reducir al máximo el número de permisos que la aplicación va a requerir ya que si no se tiene acceso a información sensible innecesaria se consigue que la aplicación sea menos vulnerable a posibles ataques.
Creando permisos
No es habitual crear permisos nuevos ya que los permisos predefinidos suelen ser suficientes para todas las aplicaciones. Si es necesario crear un nuevo permiso se debe implementar un nivel suficiente de seguridad.
No es habitual crear permisos nuevos ya que los permisos predefinidos suelen ser suficientes para todas las aplicaciones. Si es necesario crear un nuevo permiso se debe implementar un nivel suficiente de seguridad.
Uso de la red en Android
La transmisión de datos a través de una red pública tiene inherentes riesgos de seguridad, por lo que es importante que la aplicación utilice las mejores prácticas en lo que a seguridad se refiere.
Usando la red IP
El uso de la red en Android es basicamente igual que en Linux.
El uso de la red en Android es basicamente igual que en Linux.
-
Tráfico web: Se deben encriptar las comunicaciones utilizando https. Para ello se puede utilizar la clase HttpsURLConnection.
-
Sockets: Se deben encriptar utilizando SSL. Se puede utilizar la clase SSLSocket.
No se debe utilizar información confiable descargada de fuentes sin encriptar http.
Usando la red telefónica
La comunicación mediante SMS fué desarrollada para comunicación de usuarios y no de aplicaciones. Los SMS no están encriptados y la autenticación no es buena.
Google recomienda el uso de Google Cloud Messaging (GCM) y el uso de la red IP en vez de esto.
La comunicación mediante SMS fué desarrollada para comunicación de usuarios y no de aplicaciones. Los SMS no están encriptados y la autenticación no es buena.
Google recomienda el uso de Google Cloud Messaging (GCM) y el uso de la red IP en vez de esto.
Validación de los datos de entrada en apps Android
La validación de los datos de entrada suele ser uno de los principales problemas de serguridad.
Los principales problemas suelen ser buffer overflows, use after free, and off-by-one errors, script injection.
Si la aplicación utiliza base de datos SQL injection puede ser también un problema. La mejor defensa suele ser utiliar parametrized queries.
Si la aplicación utiliza base de datos SQL injection puede ser también un problema. La mejor defensa suele ser utiliar parametrized queries.
Se recomienda el uso de tipos de datos estructurados en los que los datos cumplan el formato esperado.
Manejando Datos de usuario
La mejor forma de mejorar la seguridad de los datos de usuario es minimizar el acceso a información sensible. También se debe minimizar la transmisión de datos de usuario, por ejemplo es mejor transmitir una clave numérica que una dirección de email usada como clave.
Si la aplicación accede a datos como contraseñas o nombres de usuario se deben utilizar políticas de seguridad importantes. Además, las leyes de algunos países así lo requieren.
Si la aplicación accede a datos como contraseñas o nombres de usuario se deben utilizar políticas de seguridad importantes. Además, las leyes de algunos países así lo requieren.
Las aplicaciones no deben poner al alcance de otras aplicaciones información sensible. Por ejemplo poniendo información sin control en archivos compartidos, IPC o sockets.
La escritura en logs en los dispositivos debe estar controlada. En Android los logs son un recurso compartido, a los que una aplicación puede acceder si tiene el permiso READ_LOGS.
Uso de WebView
WebView utiliza contenido web HTML, por lo que puede dar lugar a vulnerabilidades como cross-site-scripting . Android provee mecanismos que reducen el alcance de las potenciales vulnerabiliades, limitando WebViev.
Si su aplicación no utiliza directamente WebViev una buena práctica es no llamar setJavaScriptEnabled(). Por defecto WebViev no utiliza javascript, por lo que Cross Site Scripting no es posible.
Si se utiliza addJavaScriptInterface() úselo sólo con páginas web en las que la validación de entrada es robusta.
Si su aplicación accede a datos de usuario utilizndo WebViev use clearCache() para borrar los archivos almacenados localmente. Cabeceras en el lado del servidor como no-cache también pueden ser utilizadas para no almacenar algunos contenidos sensibles.
Manejando credenciales
Se recomienda minimizar las peticiones de credenciales. Esto minimiza ataques por phishing, que suplantando la identidad pueden conseguir credenciales de acceso u otras.
Si es posible, el nombre de usuario y contraseña no deben estar almacenados en el dispositivo. La autenticación inicial por nombre de usuario y contraseña puede ser sustituida por ejemplo por un token almacenado.
Los servicios accesibles por varias aplicaciones deben utilizar AccountManager.
Si es posible, el nombre de usuario y contraseña no deben estar almacenados en el dispositivo. La autenticación inicial por nombre de usuario y contraseña puede ser sustituida por ejemplo por un token almacenado.
Los servicios accesibles por varias aplicaciones deben utilizar AccountManager.
Si las credenciales son usadas solo por las aplicaciones que usted ha creado, verifique las aplicaciones que aceden a AccountManager usando checkSignature(). Si solo una aplicacion usa la credencial puede usar KeyStore.
Usando criptografía
Además del aislamiento de datos, encripción del sistema de ficheros y canales de comunicación seguros, Android ofrece una gran variedad de algoritmos de protección de datos utilizando criptografía.
Una buena práctica es usar el nivel más alto posible de seguridad para cada aplicación. Por ejemplo para una conexión a una web conocida se puede usar Https, o si se necesita un socket seguro se puede usar HttpsURLConnection o SSLSocket.
Se deben utilizar siempre claves generadas con números aleatorios. SecureRandom proporciona números aleatorios para inicializar claves criptográficas.
Comunicación entre procesos
Se recomienda usar la funcionalidad de Android como Intent, Binder o Messenger y BroadcastReceiver en vez de utilizar los mecanismos tradicionales de linux tales como sockets o archivos compartidos.
Más información en
http://developer.android.com/training/best-security.html
http://developer.android.com/training/best-security.html
Si te ha gustado este artículo dale a me gusta!!