Seguridad de Android SharedPreference

118

Me pregunto acerca de la seguridad de las preferencias compartidas.

¿Es posible acceder a las preferencias compartidas, incluso si se crearon en MODE_PRIV (0)?
¿Es posible enumerar todas las preferencias compartidas disponibles y luego recuperar todas las configuraciones de otras aplicaciones?
¿Las preferencias compartidas son un buen lugar para colocar datos confidenciales, como contraseña o token de autenticación?

Gracias

Marek Sebera
fuente
Vale la pena echarle un vistazo, con buenas respuestas. Las preferencias compartidas dicen mucho sobre el estilo de programación del desarrollador.
Vishwa Ratna

Respuestas:

232

Las preferencias compartidas se almacenan como un archivo en el sistema de archivos del dispositivo. Se almacenan, de forma predeterminada, en el directorio de datos de la aplicación con permisos del sistema de archivos establecidos que solo permiten que el UID con el que se ejecuta la aplicación específica acceda a ellos. Por lo tanto, son privados en la medida en que los permisos de archivos de Linux restringen el acceso a ellos, al igual que en cualquier sistema Linux / Unix.

Cualquiera con acceso de nivel de root al dispositivo podrá verlos, ya que root tiene acceso a todo en el sistema de archivos. Además, cualquier aplicación que se ejecute con el mismo UID que la aplicación creadora podría acceder a ellos (esto no se suele hacer y debe tomar una acción específica para que dos aplicaciones se ejecuten con el mismo UID, por lo que probablemente no sea un gran problema). preocupación). Finalmente, si alguien pudo montar el sistema de archivos de su dispositivo sin usar el sistema operativo Android instalado, también podría omitir los permisos que restringen el acceso.

Si le preocupa dicho acceso a sus preferencias (o cualquier dato escrito por su aplicación), entonces querrá cifrarlo. Si está tan preocupado por ellos, tendrá que averiguar exactamente cuánta protección es necesaria para el nivel de riesgo que ve. Hay una discusión muy extensa sobre esto en Application Security for the Android Platform , recién publicado en diciembre de 2011 (descargo de responsabilidad: soy el autor de este libro).

Thamaraiselvam
fuente
2
¿Existe alguna documentación oficial que hable de esto? ¿Tienes alguna referencia?
clu
26

SharedPreferences no son más que archivos XML en sus teléfonos / datos / datos / carpeta, por lo que cualquier aplicación o usuario con privilegios de superusuario en un dispositivo rooteado puede acceder a sus SharedPreferences, incluso si fueron creadas con MODE_PRIV

Aún así, hay una manera de protegerlo de todos ... Por favor, consulte este enlace. Aquí puede almacenar datos en pref con cifrado, la clase es autoexplicativa y muy fácil de usar.

https://github.com/sveinungkb/encrypted-userprefs

Como han dicho otros, cualquiera puede acceder a él, pero en este caso nadie puede leer los datos que contiene, ya que está cifrado. Por lo que su secure.For Máxima seguridad de mi sugerencia será generar la clave utilizada para el cifrado en tiempo de ejecución en lugar de codificar duro ella. Hay muchas formas de hacerlo :)

Jazz Haque
fuente
8
entonces, ¿cómo se guarda la clave generada?
Olayinka
3
@Olayinka Sería más seguro cifrarlo con otra clave y guardarlo en formato SharedPref. Pero entonces, ¿qué hacer con la otra llave? Sin embargo, en serio, el mejor escenario sería enviar la clave cifrada y un UID de dispositivo a un servidor que usa SSL para que se almacene allí y se recupere según sea necesario. Eso requeriría conectividad, pero le permitiría incluir un dispositivo en la lista negra y, de repente, eliminar todos los datos. Sin una conexión constante a Internet, cualquier intento de cifrar datos no es 100% seguro.
Paulo Avelar
Usé la solución anterior ... funciona 9 de cada 10 veces ... pero obtengo el error: 1e06b065: Funciones de cifrado: EVP_DecryptFinal_ex: BAD_DECRYPT "a veces ... ¿Alguien tiene una idea?
Raj Trivedi
3
@PauloAvelar Utilice Android KeyStore para el almacenamiento a largo plazo y la recuperación de claves criptográficas. Las claves no se almacenan dentro de una aplicación, por lo que no pueden verse comprometidas. La biblioteca proporcionada no lo usa. Guarda el secreto en el código, por lo que no es seguro.
apex39
13

Normalmente, no, otras aplicaciones no pueden acceder a ellos, sin embargo, debe tener en cuenta que SharedPreferences se almacenan como archivos XML en el /data/data/directorio, lo que esencialmente significa que cualquier aplicación con privilegios de superusuario en un dispositivo rooteado puede acceder a sus correos electrónicos SharedPreference, incluso si lo estuvieran creado conMODE_PRIV

aviraldg
fuente
3

¿Es posible acceder a las preferencias compartidas, incluso si se crearon en MODE_PRIV (0)?

Por código No. Pero puede recuperar el archivo de la aplicación si tiene privilegios de superusuario.

¿Es posible enumerar todas las preferencias compartidas disponibles y luego recuperar todas las configuraciones de otras aplicaciones?

Si es un superusuario (dispositivos rooteados), puede extraer todos los archivos privados de la aplicación.

¿Las preferencias compartidas son un buen lugar para colocar datos confidenciales, como contraseña o token de autenticación?

No. Se puede piratear fácilmente. Si desea poner datos confidenciales en un archivo de preferencias compartido, puede cifrar los datos y almacenarlos. Puede almacenar su clave de cifrado en NDK / server.

Rajiv Ranjan
fuente
¿Cómo se puede piratear fácilmente?
John Sardinha
Sí, el formulario de preguntas @Jo
Cuong Vo