Cómo guardar el token de acceso de Oauth de forma segura en android

Tengo acceso token desde el servidor después de la autenticación permite decir "uyhjjfjfgg567f8fhjkkf" ahora quiero guardarlo en el dispositivo de forma segura. Miré en Keystore y llavero en android desarrollador sitios. No entiendo claramente cómo funciona y cómo debemos recuperar el token del keystore.

 KeyPairGenerator kpg = KeyPairGenerator.getInstance( KeyProperties.KEY_ALGORITHM_EC, "AndroidKeyStore"); kpg.initialize(new KeyGenParameterSpec.Builder( alias, KeyProperties.PURPOSE_SIGN | KeyProperties.PURPOSE_VERIFY) .setDigests(KeyProperties.DIGEST_SHA256, KeyProperties.DIGEST_SHA512) .build()); KeyPair kp = kpg.generateKeyPair(); /* * Load the Android KeyStore instance using the the * "AndroidKeyStore" provider to list out what entries are * currently stored. */ KeyStore ks = KeyStore.getInstance("AndroidKeyStore"); ks.load(null); Enumeration<String> aliases = ks.aliases(); 

No es necesario guardar el token de acceso, ya que tiene una vida corta de todos modos. Mantenerlo en la memoria es suficiente.

Debe mantener el token de actualización y tiene algunas opciones para ello:

  • En un archivo
    • Ya sea directamente en un archivo en el almacenamiento interno
    • O utilizando SharedPreferences
    • O en una base de datos
  • Uso del AccountManager

Considere el uso de StoredCredential . Para el flujo en sí, te recomiendo que uses la biblioteca de Google AppAuth .

Por supuesto, también puede cifrar la clave usando un cifrado:

 private static byte[] encrypt(byte[] key, byte[] text) throws GeneralSecurityException { final SecretKeySpec skeySpec = new SecretKeySpec(key, KEY_ALGORITHM); final Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM); cipher.init(Cipher.ENCRYPT_MODE, skeySpec, sInitVectorSpec); return cipher.doFinal(text); } 

Y la llave se puede almacenar en el KeyStore .

Aquí puedes encontrar un artículo realmente bueno de Androidauthority sobre las posibilidades disponibles para Android Security.

Un ejemplo completo de implementación de keystore de Android se puede encontrar aquí .

Y otra buena opción es el keyczar de Google que puedes seguir en el repositorio git para obtener muestras y detalles. Allí también puede encontrar una lista detallada de los problemas de seguridad conocidos , para que pueda ver si se adapta a su implementación adicional.

Para su problema actual, recomendaría ir a Android Keystore siguiendo la implementación de ejemplo en el segundo enlace anterior.

Buena suerte !

Utilizamos una instancia SharedPreference personalizada que encripta las claves y valores al agregar y descifra al solicitar.

 SecurePreferences preferences = ... preferences.edit().putString( "key", "value" ).apply(); // key and value are encrypted automatically String value = preferences.getString( "key", null ); // key and value are decrypted automatically 

Sólo recomendaría usar SharedPreferences si los valores están encriptados, ya que aunque el archivo xml sólo está disponible para la aplicación, se puede acceder a ellos con dispositivos enraizados.

Si ya está utilizando un SqlLiteDB, probablemente lo usaría. Si no, es un poco pesado para simplemente guardar un token.

EDITAR:

Un token oauth no tiene nada que ver con la clave y el almacén de claves utilizados para firmar la aplicación.

El token oauth es un token proporcionado por el servidor después de validar las credenciales del usuario, dentro de la aplicación.

El almacén de claves contiene uno o más certificados que se utilizan para firmar digitalmente la aplicación. Esto evita que alguien más cargue una aplicación que tenga el mismo nombre de paquete que el tuyo y la reemplace.

  • Cómo hacer http obtener solicitud en Android
  • Uso de Google OAuth 2 en dispositivos incrustados basados ​​en Android
  • Cómo configurar el encabezado de autorización (OAuth token) en una solicitud Android OKHTTPClient
  • LinkedIn scribe OAuth biblioteca no puede permitir el acceso a la cuenta de LinkedIn
  • Android: autenticación de Google
  • ¿Por qué no funciona gmail oauth en mi aplicación para Android?
  • GoogleAuthUtil.getToken () devuelve un token no válido ("kid" no se encuentra en la lista de claves públicas y "exp" es dom 18 de enero de 1970)
  • Oauth 2 en una aplicación para Android
  • Cómo establecer encabezados HttpPost para una solicitud de cliente en Java Android
  • Android AccountManager authToken y OAuth
  • El esquema personalizado no parece iniciarse en la intención de la aplicación
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.