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();
- El redireccionamiento de las pestañas personalizadas de Chrome a la aplicación para Android cerrará la aplicación.
- Cómo revocar el permiso que mi aplicación recibe del usuario google gmail AccountManager.getAuthToken (
- Crear firma para la autenticación Flickr (Android SDK)
- OAuth: App Id o redirect_uri no coincide con el código de autorización
- Autorización de Yahoo OAUTH: oauth_problem = "timestamp_refused"
- Inicia sesión de Google en la aplicación de Android para consumir Cloud Endpoints backend
- Android: OAuth Callback de LinkedIn no funciona
- Dev Android: la URL de devolución de llamada no funciona ... (0_o)
- OAuth / OpenID - ¿Qué debo usar?
- ¿No debería Android StoreManager almacenar símbolos de OAuth en una base de datos por aplicación / UID?
- ¿Cómo ingresar a twitter usando Oauth desde mi aplicación Android?
- Buscando un ejemplo de trabajo (proyecto completo) para OAuth 2.0 Acceso a gmail
- Enviar Gmail mediante programación mediante Auth Cookie
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.