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

37

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. ¿Estoy buscando aprender cómo Android encripta y almacena las contraseñas? Qué clave usa y dónde se almacena esta clave, y qué algoritmo de cifrado usa.

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

Respuestas:

36

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 SOLAMENTE por primera vez. Después de la primera autenticación exitosa, Auth Tokense descarga un dispositivo que se almacena en el accounts.dbarchivo como texto sin formato. Para todos los inicios de sesión posteriores, esto Auth Tokense utiliza, NO su contraseña original.
Entonces, si su dispositivo es robado, todo lo que cualquiera puede obtener es el Auth Tokenque se invalida una vez que cambia su contraseña. Entonces, estarás al mando.
Para la máxima seguridad, te recomiendo habilitar 2-Factor Authenticationy crear Device Specific Passwordpara tu 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 viz. La aplicación Stock Email, K-9 Mail, etc. El protocolo IMAP o POP necesita una contraseña original para autenticar a los usuarios en todo momento. 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 plano (el hashing / cifrado no sirve de nada porque la clave de hashing / cifrado debe almacenarse localmente). En este caso, le recomendaría 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 hashing en texto plano localmente. Gracias a @JFSebastian por señalarlo. Desafortunadamente, dicha implementación para Android aún no está disponible. Al iniciar ICS, Android proporciona KeyChain API mediante el cual una aplicación puede almacenar una contraseña localmente en forma segura. Las aplicaciones que usan KeyChain API son raras, pero la aplicación de correo electrónico común lo usa (Gracias a @wawa por esta información). Por lo tanto, su contraseña estará segura con la aplicación de correo electrónico estándar 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.

Android Quesito
fuente
66
@JF Sebastian: incluso suponiendo que confía completamente en el tercero que almacena sus contraseñas, esas fueron solo marginalmente más seguras que simplemente almacenar la contraseña en el dispositivo. El dispositivo aún necesita poder recuperar el texto sin formato de la contraseña del almacenamiento en la nube y el dispositivo todavía tiene que guardar la contraseña en la memoria caché localmente porque no desea tener que volver a conectar su dispositivo de seguridad cada vez que ingresa a un túnel o áreas con recepción débil Lo peor que puede hacer en seguridad es proporcionar una falsa sensación de seguridad.
Lie Ryan
44
@JFSebastian: en conclusión, la única forma verdaderamente segura de autenticación es hacer lo que Google hizo con la aplicación Gmail, es decir, usar un esquema de autenticación no estándar con token de autenticación. Incluso si alguien logró robar su token de autenticación, puede invalidar remotamente el token, y no necesita cambiar su contraseña porque el texto sin formato de la contraseña nunca se vio comprometido. La otra forma segura es usar dongle sin sesiones; bueno, ya sabes lo que sucede cuando haces eso, tus usuarios simplemente dejarán el dongle conectado permanentemente.
Lie Ryan
55
@JFSebastian: Creo que te estás perdiendo el punto. Cifrar la contraseña no es más segura que simplemente almacenarla en texto sin formato, ni siquiera por un bit. Cualquier atacante que logre copiar las cuentas.db también puede copiar la clave de descifrado junto con ella; Lo único que le proporciona el cifrado es una falsa sensación de seguridad , que es peor que no tener seguridad. Sí, hay soluciones que son mucho mejores que almacenar una contraseña de texto sin formato, pero todas requieren cambios en el protocolo de correo electrónico, por lo que tenemos que vivir con lo que tenemos actualmente. O hágalo correctamente de una manera no estándar como lo hizo Gmail.
Lie Ryan
3
El servicio de llavero @JFSebastian Apples o el proporcionado por el kernel de Linux no es una opción más segura. La contraseña aún permanece en la memoria y si el llavero está desbloqueado, incluso sin encriptar. Por lo tanto, es probable que sea un poco más difícil de obtener como el archivo .db de solo lectura. Google implementó la mejor solución posible al usar un token de autenticación que se puede invalidar en caso de que el dispositivo se vea comprometido. La siguiente opción más segura sería ingresar la contraseña cada vez o simplemente evitar el uso del correo electrónico.
Flujo
44
@LieRyan A partir de ICS, la aplicación de correo electrónico de stock en realidad usa la API KeyStore, no texto simple. android-developers.blogspot.com/2012/03/…
Wesley Wiser
12

Las contraseñas de Android utilizadas con la aplicación de correo electrónico incorporada se almacenan en texto plano 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 con 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 plano, aún sería trivial descifrar 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 hoy todavía se aplica:

Ahora, con respecto a esta preocupación particular. Lo primero que hay que aclarar 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 retengamos 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 en contraste 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 # 38 , que está bien escrito y es bastante informativo. Proporciona algunos antecedentes muy buenos sobre la diferencia entre "ocultar" las contraseñas y hacerlas verdaderamente "seguras". Simplemente ocultar su contraseña (por ejemplo, base64) o encriptarla con una clave almacenada en otro lugar no hará que su contraseña o sus datos sean 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 sin cifrar. 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, luego 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 .

Zuul
fuente
Guau. Eso me asombra. No era consciente del hecho de que está almacenado en texto sin formato. Olvídate de rooteado o no rooteado. Si le roban su dispositivo, una persona sin escrúpulos podría obtener fácilmente sus credenciales incluso si tuviera que bloquear el teléfono con una clave de seguridad. Dado este hecho, ¿también conoce algún mecanismo de encriptación de todo el disco?
asudhak
1
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 system.
Wyzard --Detener Dañar a Monica--
1
Zuul, agradezco tu esfuerzo por poner las respuestas, pero creo que esta respuesta es muy engañosa. Si revisa la cotización que ha citado nuevamente, la aplicación Gmail no almacena la contraseña. --edite también la respuesta @SachinShekhar.
roxan
2
@asudhak Si alguna aplicación está usando una 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.
Android Quesito
2
@roxan No pude encontrar nada que indique que la aplicación de Gmail no almacena la contraseña . ¿Puede proporcionar una cotización o un enlace?
Flujo