我环顾四周,没有找到有关Android如何在设备上存储密码的信息。特别是Gmail密码。我正在寻找学习Android如何加密和存储密码?它使用什么密钥,该密钥存储在哪里,以及使用哪种加密算法。
我环顾四周,没有找到有关Android如何在设备上存储密码的信息。特别是Gmail密码。我正在寻找学习Android如何加密和存储密码?它使用什么密钥,该密钥存储在哪里,以及使用哪种加密算法。
Answers:
Gmail的官方应用程序 不会在您的设备中存储密码。如果您使用此应用程序,则密码是100%安全的。
它是这样工作的:密码仅由Google的身份验证服务器首次使用。首次成功认证后,将Auth Token
下载到设备并accounts.db
以纯文本形式存储在文件中。对于所有后续登录,Auth Token
将使用此密码,而不是您的原始密码。
因此,如果您的设备被盗,则任何人都能获得的是Auth Token
一旦更改密码便无效。因此,您将处于最终的指挥权。
为了获得最高的安全性,建议您为设备启用2-Factor Authentication
并创建Device Specific Password
。丢失设备后,您只需禁用该设备即可。您甚至不需要更改主密码。
注意:如果您将第三方电子邮件应用程序用于Gmail viz,则并非全部如此。股票电子邮件应用程序,K-9 Mail等。IMAP或POP协议每次都需要原始密码来验证用户身份。因此,在将其发送到服务器之前,需要向电子邮件应用提供普通密码。因此,大多数电子邮件应用程序将密码存储为纯文本格式(哈希/加密无用,因为哈希/加密密钥需要存储在本地)。在这种情况下,建议您为设备启用2-Factor Authentication
并创建Device Specific Password
。丢失设备后,您只需禁用该设备即可。
更新:
从技术上讲,可以以加密/散列形式在本地存储密码,而无需在本地将加密密钥/哈希密钥保留为纯文本格式。感谢@JFSebastian指出。不幸的是,这种针对Android的实现尚不可用。从ICS开始,Android提供了KeyChain API,应用程序可以使用KeyChain API以安全的形式在本地存储密码。使用KeyChain API的应用程序很少见,但普通的电子邮件应用程序使用它(感谢@wawa提供此信息)。因此,只要您的屏幕被锁定,您的密码在股票电子邮件应用中将是安全的。请记住,如果设备已植根并且在ICS之前的设备上不可用,则KeyChain是不安全的。
内置电子邮件应用程序使用的Android密码以纯文本格式存储在SQLite数据库中。这与使用Sachin Sekhar的答案中所述的Auth Token 的Gmail应用程序形成对比。
对于Jelly Bean,数据库位置为:
/data/system/users/0/accounts.db
以上位置因Android版本而异
非root用户设备上的此位置受操作系统保护和保护。
在植根设备上,用户已经在技术上破解了他们自己的安全性,即使它不是纯文本形式的,解密也仍然是微不足道的,因为密钥必须存在于设备上才能实现。
Android开发团队的一名成员发布了一个解释,直到今天仍然适用:
现在,关于这个特殊问题。首先要说明的是,电子邮件应用程序支持四种协议-POP3,IMAP,SMTP和Exchange ActiveSync-除了极少数非常有限的例外之外,所有这些都是较旧的协议,它们要求客户端向服务器提供密码在每个连接上。这些协议要求我们保留密码,直到您希望在设备上使用该帐户。较新的协议不会这样做-例如,这就是为什么某些文章与Gmail形成对比的原因。较新的协议允许客户端一次使用密码来生成令牌,保存令牌并丢弃密码。
我敦促您阅读注释38中链接的文章,该文章写得很好并且内容丰富。它为“模糊”密码与使它们真正“安全”之间的区别提供了非常好的背景。仅仅掩盖您的密码(例如base64)或使用存储在其他位置的密钥对其进行加密不会使您的密码或数据更加安全。攻击者仍将能够检索它。
(特别是,有人对其他一些电子邮件客户端未以明文形式存储密码提出了一些主张。即使这是正确的,也并不表示密码更安全。一个简单的测试:是否可以启动密码设备,它将开始在您配置的帐户上接收电子邮件,因此密码不是真正安全的密码。它们要么被混淆,要么被存储在其他地方的另一个密钥加密。)
另外,由于此问题似乎困扰许多Android用户,因此您也可以在Slashdot-以纯文本格式存储的Android密码数据中关注此讨论。
accounts.db
文件被以外的其他帐户读取system
。