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.
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 Token
se descarga un correo electrónico al dispositivo que se almacena en accounts.db
un archivo como texto sin formato. Para todos los inicios de sesión posteriores, Auth Token
se utiliza esta, NO su contraseña original.
Entonces, si le roban su dispositivo, todo lo que cualquiera puede obtener es Auth Token
que 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 Authentication
y cree Device Specific Password
para 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 Authentication
y cree Device Specific Password
para 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.
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 .
accounts.db
archivo está protegido para que no lo lean otras cuentas que no sean system
./data/system/sync/accounts.xml
(sí, es XML), como dice este artículo .
Flujo
asudhak
Flujo