¿Cómo se almacena la contraseña de Gmail en Android y dónde?

Miré a mi alrededor y no encontré información sobre cómo Android logra almacenar contraseñas en el dispositivo. Especialmente las contraseñas de Gmail. ¿Quiero saber cómo Android cifra y almacena contraseñas? Qué clave usa y dónde se almacena esta clave, y qué algoritmo de encriptación usa.

¿Por qué la contraseña almacenada debe cifrarse con una clave? Esto solo significaría que uno tiene que ingresar la clave cada vez que se requiere la contraseña, entonces simplemente no puede almacenar la contraseña e ingresarla cada vez.
Um, la clave podría ser específica del dispositivo, obtenida del IMEI del teléfono o algo así. Lo que significa que el software puede obtener la clave sin que el usuario la escriba cada vez.
¿Qué impide que cualquier otra pieza de software que se ejecute en el teléfono obtenga la clave? Este enfoque no agrega una capa adicional de seguridad

Respuestas (2)

La aplicación oficial de Gmail no almacena la contraseña en su dispositivo. Su contraseña es 100% segura si usa esta aplicación.

Así es como funciona: los servidores de autenticación de Google utilizan la contraseña SOLO por primera vez. Después de la primera autenticación exitosa, Auth Tokense descarga un correo electrónico al dispositivo que se almacena en accounts.dbun archivo como texto sin formato. Para todos los inicios de sesión posteriores, Auth Tokense utiliza esta, NO su contraseña original.
Entonces, si le roban su dispositivo, todo lo que cualquiera puede obtener es Auth Tokenque se vuelva inválido una vez que cambie su contraseña. Entonces, estarás al mando final.
Para mayor seguridad, le recomiendo que habilite 2-Factor Authenticationy cree Device Specific Passwordpara su dispositivo. Después de perder el dispositivo, todo lo que necesita es desactivar ese dispositivo. Ni siquiera necesita cambiar la contraseña principal.

Nota: Todo esto no es cierto si usa aplicaciones de correo electrónico de terceros para Gmail, a saber. La aplicación Stock Email, K-9 Mail, etc. El protocolo IMAP o POP necesita una contraseña original para autenticar a los usuarios cada vez. Por lo tanto, la contraseña simple debe estar disponible para la aplicación de correo electrónico antes de enviarla al servidor. Por lo tanto, la mayoría de las aplicaciones de correo electrónico almacenan contraseñas en texto sin formato (el hash/cifrado es inútil porque la clave de hash/cifrado debe almacenarse localmente). En este caso, le recomiendo que habilite 2-Factor Authenticationy cree Device Specific Passwordpara su dispositivo. Después de perder el dispositivo, todo lo que necesita es desactivar ese dispositivo.

Actualización:
técnicamente, es posible almacenar contraseñas localmente en forma cifrada/hash sin mantener la clave de cifrado/clave hash en texto sin formato localmente. Gracias a @JFSebastian por señalarlo. Desafortunadamente, dicha implementación para Android aún no está disponible. A partir de ICS, Android proporciona KeyChain API mediante el cual una aplicación puede almacenar una contraseña localmente de forma segura. Las aplicaciones que usan KeyChain API son raras, pero la aplicación de correo electrónico estándar las usa (gracias a @wawa por esta información). Por lo tanto, su contraseña estará segura con la aplicación de correo electrónico de valores siempre que su pantalla esté bloqueada. Recuerde, KeyChain no es seguro si el dispositivo está rooteado y no está disponible en dispositivos anteriores a ICS.

Los comentarios no son para una discusión extensa; esta conversación se ha movido a chat .

Las contraseñas de Android utilizadas con la aplicación de correo electrónico integrada se almacenan en texto sin formato dentro de una base de datos SQLite. Esto contrasta con la aplicación Gmail , que usa tokens de autenticación como se describe en la respuesta de Sachin Sekhar .

Para Jelly Bean, la ubicación de la base de datos es:

/data/system/users/0/accounts.db

La ubicación anterior varía según la versión de Android

Esta ubicación en un dispositivo no rooteado está asegurada y protegida por el sistema operativo.
En los dispositivos rooteados, los usuarios ya han descifrado técnicamente su propia seguridad, e incluso si no estuviera en texto sin formato, sería trivial descifrarlo, ya que la clave debe existir en algún lugar del dispositivo para hacerlo.

Un miembro del equipo de desarrollo de Android publicó una explicación que hasta el día de hoy todavía se aplica:

Ahora, con respecto a esta preocupación particular. Lo primero que debe aclararse es que la aplicación de correo electrónico admite cuatro protocolos: POP3, IMAP, SMTP y Exchange ActiveSync, y con muy pocas excepciones muy limitadas, todos estos son protocolos más antiguos que requieren que el cliente presente la contraseña al servidor. en cada conexión. Estos protocolos requieren que conservemos la contraseña durante el tiempo que desee utilizar la cuenta en el dispositivo. Los protocolos más nuevos no hacen esto; es por eso que algunos de los artículos han estado contrastando con Gmail, por ejemplo. Los protocolos más nuevos permiten que el cliente use la contraseña una vez para generar un token, guardar el token y descartar la contraseña.

Le insto a que revise el artículo vinculado en el comentario n.° 38 , que está bien escrito y es bastante informativo. Proporciona muy buenos antecedentes sobre la diferencia entre "ocultar" las contraseñas y hacerlas verdaderamente "seguras". El simple hecho de oscurecer su contraseña (p. ej., base64) o cifrarla con una clave almacenada en otro lugar no hará que su contraseña o sus datos estén más seguros. Un atacante aún podrá recuperarlo.

(En particular, se han hecho algunas afirmaciones sobre algunos de los otros clientes de correo electrónico que no almacenan la contraseña en texto claro. Incluso cuando esto es cierto, no indica que la contraseña sea más segura. Una prueba simple: si puede iniciar el dispositivo y comenzará a recibir correo electrónico en sus cuentas configuradas, entonces las contraseñas no son realmente seguras. Están ofuscadas o encriptadas con otra clave almacenada en otro lugar).

Además, dado que este problema parece molestar a muchos usuarios de Android, también puede seguir esta discusión en Slashdot: datos de contraseña de Android almacenados en texto sin formato .

Guau. Eso me asombra. No estaba al tanto del hecho de que se almacena en texto sin formato. Olvídate de estar rooteado o no rooteado. Si le roban su dispositivo, una persona sin escrúpulos podría obtener fácilmente sus credenciales incluso si bloqueara el teléfono con una llave de seguridad. Dado este hecho, ¿también conoce algún mecanismo de cifrado en todo el disco?
Bueno, acabo de enterarme de que las contraseñas NO están en texto sin formato. account.db tenía los nombres de usuario de las distintas cuentas junto con algunas cadenas de aspecto extraño. Sospeché una codificación base64 simple, pero tampoco fue así. Por lo tanto, debe estar utilizando algún tipo de mecanismo de token de acceso como lo indica @SachinShekhar. Pero aún me gustaría confirmar si estas 'cadenas' no son una forma de contraseña cifrada.
Sean lo que sean, son algo que se puede usar para obtener acceso a la cuenta. Pero, @SachinShekhar, el accounts.dbarchivo está protegido para que no lo lean otras cuentas que no sean system.
Zuul, agradezco el esfuerzo que pones en las respuestas, pero creo que esta respuesta es muy engañosa. Si revisa la cotización que ha cotizado nuevamente, la aplicación Gmail no almacena la contraseña. --editar la respuesta de @SachinShekhar también.
@asudhak Si alguna aplicación usa la contraseña original, NO hay forma de protegerla. Un pirata informático puede decodificar una cadena codificada de accounts.db después de encontrar la clave de cifrado/hashing que debe almacenarse localmente porque la aplicación de correo electrónico necesitaría esta clave para compilar la contraseña original antes de enviarla al servidor.
@roxan No pude encontrar nada que indique que la aplicación Gmail no almacena la contraseña. ¿Puede proporcionar una cotización o un enlace?
He convertido esta respuesta en una wiki comunitaria, para permitir que todos mejoren su contenido. Dado que las opiniones divergen, de esta manera todos pueden contribuir.
Mi teléfono es ASUS Zenfone 2, con Android 5.0, y la ubicación del archivo de "base de datos" es /data/system/sync/accounts.xml(sí, es XML), como dice este artículo .