2011-02-05 18 views
31

Actualmente estoy desarrollando un marco para el acceso de oAuth 1 y 2 a los servicios web y mi pregunta es, ¿cómo puedo almacenar datos confidenciales como una clave de acceso oAuth de una manera segura? el problema con estas teclas es que algunas plataformas como Twitter usan una clave permanente y si alguien tiene acceso a esta tecla puede hacer lo que quiera con la cuenta de Twitter de los usuarios ...cifrar datos en SharedPreferences

así que es posible cifrar automáticamente el datos antes de que se almacena en las preferencias compartidas? ¿O hay una mejor forma/lugar para almacenar datos muy importantes?

ACTUALIZACIÓN - Lea también: What is the most appropriate way to store user settings in Android application

+1

http://stackoverflow.com/a/6393502/82156 – emmby

+0

Leer esto le dará mucho más en esta idea http://stackoverflow.com/a/20560574/730807 –

Respuesta

32

1). ¿Cómo encriptar?

En Android, el cifrado se realiza a través de Java Cryptography Architecture (JCA). Principalmente es el paquete javax.crypto.*.

JCA Reference Guide

Aquí se presenta una example de uso de la API JCA (AES alrorithm en particular).

2). Dónde almacenar?

La API de cifrado manipula con matrices de bytes (no cadenas). Esto significa que puede usar SharedPreferences, pero deberá aplicar la codificación Base-64 en la matriz de bytes cifrados antes de ponerlo en SharedPreferences (de lo contrario, el analizador XML no podrá leer el archivo de preferencias compartidas). Luego, para leer necesitará usar la decodificación Base-64. Tenga en cuenta que, de forma predeterminada, la mayoría de las versiones del sistema operativo Android no tienen una API Base-64 incorporada (consulte la sección ACTUALIZACIÓN). Por lo tanto, para eliminar esta sobrecarga Base-64 recomendaría simplemente almacenar sus bytes en un private file.

ACTUALIZACIÓN: Desde API Nivel 8, la API tiene android.util.Base64.

50

También puede echar un vistazo a esta clase que hice para hacer exactamente esto: https://github.com/sveinungkb/encrypted-userprefs

Se utiliza AES en lugar de la DES en desuso y débil utilizado en la otra sugerencia.

+3

Gracias. Esto fue muy necesario. Creo que si agregas los JavaDocs, eso sería aún más sorprendente. :) – Sufian

+2

Voy a investigar ese Sufian, gracias! –

+0

Gracias por compartir tu esfuerzo ... :) –

0

This article en CodeProject contiene un bonito envoltorio para las Preferencias compartidos. Sin embargo, el nombre de clase SecurePreferences es engañoso, algo como ObfuscatedPreferences sería más apropiado.

3

Recomendaría el uso de Facebook Conceal para el cifrado en Android casi siempre: es una biblioteca rápida de Android que toma decisiones realmente acertadas y te deja con algunas interfaces simples para hacer realmente el trabajo.

¡Bonus! Recientemente he reconstruido el rompecabezas de cómo puedes usarlo de Xamarin; mira mi artículo en securing your C# app's data using conceal para obtener más información.

0

Usted puede cifrar los datos en las preferencias y guardar la clave de cifrado en el sistema Android Keystore. De esta forma, su clave de encriptación también sería segura.

se puede mirar en una biblioteca hacer esto https://github.com/ophio/secure-preferences

1

Trate de usar nuestro componente https://github.com/BottleRocketStudios/Android-Vault Vault. Utilizará el Almacén de claves de Android (en dispositivos compatibles) o una técnica de Ofuscación para encriptar valores en un archivo SharedPreference e implementará la interfaz SharedPreference, por lo que se trata en gran parte de un reemplazo directo.

3

Deberías echar un vistazo a Slink. Me di cuenta de que la mayoría de las herramientas de cifrado de Preferencias Compartidas usan cifrado para cada acción que realiza, lo que significa que cada par clave-valor se guarda solo después de cifrar la clave y el valor por separado. Esto crea una gran sobrecarga de rendimiento.

Así que busqué una biblioteca que me proporcione un proceso de encriptación más eficiente y encontré Slink. Slink utiliza la biblioteca Ocultación de Facbook para guardar todo el mapa de objetos en su conjunto, lo que lo convierte en la solución de cifrado de Preferencias Compartidas más eficiente y rápida. También utiliza las interfaces comunes de SharedPreferences de Android, lo que hace que el uso sea extremadamente fácil y casi perfecto. Descargo de responsabilidad: soy parte del equipo de desarrollo que desarrolla esta biblioteca.