Voy a usar oAuth para buscar correos y contactos de google. No deseo pedirle al usuario cada vez que inicie sesión para obtener un token de acceso y un 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 puede encriptar y descifrar los tokens, pero es fácil para un atacante simplemente descompilar su 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?¿Cómo almacenar de forma segura el token de acceso y el secreto en Android?
Respuesta
Guárdelos 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 intenta leerlos, es posible que la aplicación pueda usarlos, pero no puede protegerse contra eso. En cuanto al cifrado, debe exigir al usuario que ingrese la frase clave de descifrado cada vez (anulando así el propósito de las credenciales de almacenamiento en caché), o guardar la clave en un archivo, y se obtiene el mismo problema.
Hay algunas ventajas de almacenar fichas en lugar del nombre de usuario real:
-
aplicaciones
- de terceros no necesitan saber la contraseña y el usuario puede estar seguro de que sólo se envían a la original sitio (Facebook, Twitter, Gmail, etc.)
- Incluso si alguien roba un token, no puede ver la contraseña (que el usuario podría estar usando en otros sitios también)
- Los tokens generalmente tienen una duración y caducan después de un cierto tiempo
- Tokens pueden ser revocados si sospecha que se han visto comprometidos
thx para la respuesta!pero ¿cómo puedo saber si mi clave de consumidor se ha visto comprometida? jaja, será difícil de decir ... ok sobre el almacenamiento del token de acceso y el secreto, ok, los guardo en las preferencias compartidas y encriptarlos, pero ¿qué pasa con la clave del consumidor y el secreto? No puedo almacenarlos en preferencias compartidas (necesitaría escribir explícitamente la clave del consumidor y el secreto en el código para guardarlo en preferencia compartida). No sé si entiendes lo que quiero decir. – yeahman
Tienes que poner la aplicación de una manera (un tanto) ofuscada, para que no sean inmediatamente visibles después de la descompilación, o usar tu propia aplicación de proxy de autenticación de autentificación que tenga la clave y el secreto. Ponerlos en la aplicación es obviamente más fácil, y si piensas que el riesgo de que alguien intente descifrar tu aplicación es suficientemente bajo, toma ese enfoque. Por cierto, los puntos anteriores son para la contraseña del usuario. Si descubres que tu clave/secreto de consumidor se ha visto comprometido, puedes revocarlos también (eso, por supuesto, romperá tu aplicación). –
ok thx ... iré con la ofuscación (¿me pueden recomendar alguna buena herramienta para hacerlo?) ... tener una aplicación de proxy no es muy atractiva ya que tendría que obligar a mis usuarios a registrarse en mi sitio ... no muy fácil de usar, agregando un paso adicional en toda la cadena ... – yeahman
Puede almacenarlos en AccountManager. Se considera la mejor práctica según estos tipos.
Aquí es la definición oficial:
Esta clase proporciona acceso a un registro centralizado de cuentas en línea del usuario. El usuario ingresa las credenciales (nombre de usuario y contraseña) una vez por cuenta, otorgando a las aplicaciones acceso a los recursos en línea con aprobación de "un clic".
Para una guía detallada sobre cómo utilizar AccountManager:
Sin embargo, al final AccountManager sólo almacena el token como texto sin formato . Por lo tanto, sugeriría encriptar su secreto antes de almacenarlos en AccountManager. Puede utilizar varias bibliotecas de cifrado como AESCrypt o AESCrypto
Otra opción es usar Conceal library. 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.
byte[] cipherText = crypto.encrypt(plainText);
byte[] plainText = crypto.decrypt(cipherText);
Hope that's helps.
Buen consejo que ocultan. Parece muy fácil de usar. Y para muchos casos de uso. – lagos
Bueno, puede asegurar el token de acceso al seguir dos opciones.
- Use su token de acceso en el almacén de claves de Android que no sea inverso. función
- Uso NDK con un poco de cálculo que guardar su ficha y NDK con C++ código que es muy difícil de revertir
- Desde el panel Proyecto de Android Studio, seleccione "Archivos de proyecto" y crear un nuevo archivo llamado "keystore.properties" en el directorio raíz de su proyecto.
-
archivo "keystore.properties"
- Abrir y guardar su token de acceso y secreto en el archivo.
Ahora carga la lea el token de acceso y secreto en su aplicación build.gradle archivo del módulo de. 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 parecerse a lo siguiente:
... ... ... android { compileSdkVersion 26 // Load values from keystore.properties file def keystorePropertiesFile = rootProject.file("keystore.properties") def keystoreProperties = new Properties() keystoreProperties.load(new FileInputStream(keystorePropertiesFile)) defaultConfig { applicationId "com.yourdomain.appname" minSdkVersion 16 targetSdkVersion 26 versionCode 1 versionName "1.0" testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" // Create BuildConfig variables buildConfigField "String", "ACCESS_TOKEN", keystoreProperties["ACCESS_TOKEN"] buildConfigField "String", "SECRET", keystoreProperties["SECRET"] } }
Puede utilizar su token de acceso y el secreto de su código como este:
String accessToken = BuildConfig.ACCESS_TOKEN; String secret = BuildConfig.SECRET;
De esta manera no es necesario almacene el token de acceso y el secreto en texto plano dentro de su proyecto. Por lo tanto, incluso si alguien descompila su APK, nunca recibirá su token de acceso y secreto mientras los está cargando desde un archivo externo.
Parece que no hay diferencia que la creación de un archivo de propiedades en lugar de la codificación difícil. – Dzshean
Una buena alternativa. –
SharedPreferences is not una ubicación segura. En un dispositivo rooteado, easily puede leer y modificar todas las aplicaciones 'SharedPrefereces xml's'. Incluso si un token caduca cada hora, aún 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 encriptar nuestros tokens con el fin de almacenarlos en, p. Ej. Preferencias compartidas. Las claves no se almacenan dentro del proceso de una aplicación, por lo que se comprometen al are harder.
- 1. ¿Forma correcta de almacenar de forma segura el token/secreto/etc. de OAuth?
- 2. Almacenar de forma segura el (los) token (s) de Oauth en el archivo
- 3. Cómo almacenar archivos de forma segura en el servidor
- 4. almacenar de forma segura las contraseñas cuando el acceso al texto en claro todavía se necesita
- 5. Almacenar una contraseña de forma segura
- 6. ¿Cuán importante es mantener secreto el token de acceso de OAuth?
- 7. Inicio de sesión de cliente: cómo almacenar credenciales de forma segura en el lado del cliente?
- 8. ¿Por qué OAuth proporciona un token de acceso y un secreto de token de acceso? ¿Por qué no solo un solo valor?
- 9. ¿Cómo mantener el secreto del consumidor de OAuth seguro, y cómo reaccionar cuando está en peligro?
- 10. ¿Cómo obtener el token de acceso de GoogleCredential?
- 11. ¿Vence el token de acceso a Twitter?
- 12. Cómo obtener token de acceso permanente en el gráfico API
- 13. Cliente OAuth personalizado en MVC4/DotNetOpenAuth - falta token secreto de acceso
- 14. ¿Hay alguna manera de almacenar de forma segura los datos de usuario en un dispositivo Android?
- 15. ¿Cómo puedo almacenar de forma segura y acceder a los detalles de la cadena de conexión?
- 16. Cómo almacenar datos de manera segura en MySQL usando AES_ENCRYPT
- 17. token de acceso de linkedin para la aplicación de Android
- 18. Usando Facebook OAuth 2.0 - ¿Cómo obtengo el token de acceso?
- 19. ¿Cómo obtener el token de acceso para google oauth?
- 20. ¿Cómo se genera el token de acceso mediante el token de actualización a través de la API de Google Drive?
- 21. ¿Almacenar de forma segura una contraseña en el código del programa?
- 22. ¿Cómo guardar de forma segura un archivo en el disco en Android?
- 23. Almacenamiento seguro de un token de acceso
- 24. Cómo almacenar de forma segura los detalles de la Cadena de conexión en VBA
- 25. ¿Hay alguna forma de comprobar si el token de acceso de Facebook sigue siendo válido?
- 26. Cómo obtener el token de acceso desde el método FB.login en javascript SDK
- 27. ¿El token de acceso puede tener más de 255 caracteres?
- 28. ¿Cómo puedo hacer que InternalsVisibleAtribuya el trabajo al firmar una clave pública de token de forma segura?
- 29. Cómo pasar el Id de Facebook del cliente al servidor de forma segura
- 30. Cómo almacenar de forma segura la clave de cifrado en un ensamblado .NET
¿Cómo almaceno la clave y el secreto del consumidor (no es seguro protegerlos)? Necesito que soliciten acceso y secreto ... ¿Cómo lo hacen las otras aplicaciones existentes que usan oauth? hmm finalmente con oauth, necesitas ocuparte de muchos más problemas de seguridad para mí ... necesito guardar el token/secreto del consumidor de forma segura y también el acceso y el secreto ... finalmente, ¿no sería más sencillo solo almacena el nombre de usuario/contraseña del usuario encriptado? ... al final, ¿no es este último mejor? Todavía no puedo ver cómo oauth es mejor ... – yeahman
¿Puedes decirme ... qué archivo almacena el token de acceso? Soy nuevo en Android y traté de ejecutar la aplicación Plus de ejemplo. Pero no encuentro esto en ninguna parte [método GoogleAuthUtil.getToken().] –