Voy a usar oAuth para buscar correos y contactos de google. No quiero pedirle al usuario cada vez que inicie sesión para obtener un token de acceso y secreto. Por lo que entendí, necesito almacenarlos con mi aplicación en una base de datos o SharedPreferences
. Pero estoy un poco preocupado por los aspectos de seguridad con eso. Leí que puedes cifrar y descifrar los tokens, pero es fácil para un atacante descompilar tu apk y clases y obtener la clave de cifrado.
¿Cuál es el mejor método para almacenar de forma segura estos tokens en Android?
123
Respuestas:
Almacénelos como preferencias compartidas . Esos son privados por defecto, y otras aplicaciones no pueden acceder a ellos. En dispositivos rooteados, si el usuario permite explícitamente el acceso a alguna aplicación que está tratando de leerlos, la aplicación puede usarlos, pero no puede protegerse contra eso. En cuanto al cifrado, debe solicitar al usuario que ingrese la frase de contraseña de descifrado cada vez (lo que anula el propósito de almacenar en caché las credenciales) o guardar la clave en un archivo, y obtendrá el mismo problema.
Hay algunos beneficios de almacenar tokens en lugar de la contraseña de nombre de usuario real:
fuente
Puede almacenarlos en AccountManager . Se considera la mejor práctica según estos tipos.
Aquí está la definición oficial:
Para obtener una guía detallada sobre cómo usar AccountManager:
Sin embargo, al final AccountManager solo almacena su token como texto sin formato. Por lo tanto, sugeriría cifrar su secreto antes de almacenarlos en AccountManager. Puede utilizar varias bibliotecas de cifrado como AESCrypt o AESCrypto
Otra opción es usar la biblioteca Oculta . Es lo suficientemente seguro para Facebook y mucho más fácil de usar que AccountManager. Aquí hay un fragmento de código para guardar un archivo secreto usando Ocultar.
fuente
SharedPreferences no es una ubicación segura en sí misma. En un dispositivo rooteado, podemos leer y modificar fácilmente los xml de preferencias compartidas de todas las aplicaciones. Por lo tanto, los tokens deberían caducar con relativa frecuencia. Pero incluso si un token caduca cada hora, todavía se pueden robar tokens más nuevos de SharedPreferences. Android KeyStore se debe utilizar para el almacenamiento a largo plazo y la recuperación de claves criptográficas que se utilizarán para cifrar nuestros tokens para almacenarlos en, por ejemplo, SharedPreferences o una base de datos. Las claves no se almacenan dentro del proceso de una aplicación, por lo que es más difícil comprometerlas.
Entonces, más relevante que un lugar es cómo pueden ser seguros, por ejemplo, utilizando JWT de vida corta firmados criptográficamente, cifrándolos usando Android KeyStore y enviándolos con un protocolo seguro
fuente
Ahora carga la lea el token de acceso y secreto en su aplicación de módulo de build.gradle archivo. Luego debe definir la variable BuildConfig para su Token de acceso y Secreto para que pueda acceder directamente a ellos desde su código. Su build.gradle puede verse así:
Puede usar su Token de acceso y Secreto en su código de esta manera:
De esta manera, no necesita almacenar el token de acceso y el secreto en texto plano dentro de su proyecto. Por lo tanto, incluso si alguien descompila su APK, nunca obtendrá su Token de acceso y Secreto mientras los carga desde un archivo externo.
fuente
Bueno, puede asegurar su token de acceso siguiendo dos opciones.
fuente