Gmail密码如何存储在Android中-以及存储在哪里?


37

我环顾四周,没有找到有关Android如何在设备上存储密码的信息。特别是Gmail密码。我正在寻找学习Android如何加密和存储密码?它使用什么密钥,该密钥存储在哪里,以及使用哪种加密算法。


1
为什么要使用密钥对存储的密码进行加密?这仅意味着每次需要密码时都必须输入密钥,然后您就无法存储密码并每次都输入密码。
流程

嗯,密钥可能是设备专用的,可以从手机IMEI或其他工具获得。这意味着,软件无需用户每次都键入即可获取密钥。
asudhak 2012年

1
是什么阻止手机上运行的任何其他软件来获取密钥?这种方法没有增加额外的安全层
Flow

Answers:


36

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是不安全的。


6
@JF Sebastian:即使假设您完全信任存储密码的第三方,也比仅将密码存储在设备本身中安全得多。设备仍然需要能够从云存储中检索密码的纯文本,并且设备仍然必须在本地缓存密码,因为您不想每次进入隧道或区域时都必须重新连接加密狗。接待不佳。安全性最糟糕的事情是提供一种错误的安全感。
Lie Ryan

4
@JFSebastian:总而言之,唯一真正安全的身份验证方法是执行Google对Gmail应用程序所做的操作,即使用带有身份验证令牌的非标准身份验证方案。即使有人设法窃取了您的auth令牌,您也可以远程使令牌无效,并且您无需更改密码,因为密码明文从未受到破坏。另一种安全的方法是不使用会话就使用加密狗。好吧,您知道这样做时会发生什么,您的用户将只将加密狗永久连接。
Lie Ryan

5
@JFSebastian:我认为您错过了重点。加密密码不仅比仅以纯文本形式存储密码更安全,甚至一点也不安全。任何设法复制accounts.db的攻击者也可以复制解密密钥。加密给您的唯一一件事就是错误的安全感,这比没有安全性还差。是的,有些解决方案比存储纯文本密码要好得多,但是所有解决方案都需要更改电子邮件协议,因此我们必须继续使用现有的解决方案。或者以非标准的方式像Gmail一样正确地进行操作。
Lie Ryan

3
@JFSebastian苹果的钥匙串服务或Linux内核提供的钥匙串服务不是更安全的选择。密码仍然会在内存中徘徊,并且即使未加密钥匙串也已解锁。因此,以根可读的.db文件的形式获取它可能只会稍微困难一点。Google通过使用auth令牌实施了尽可能可行的最佳解决方案,该令牌可以在设备遭到破坏时失效。下一个更安全的选择是每次都输入密码,或者完全避免使用电子邮件。
流程

4
@LieRyan从ICS开始,股票的电子邮件应用程序实际上使用的不是纯文本的KeyStore api。android-developers.blogspot.com/2012/03/…–
Wesley Wiser

12

内置电子邮件应用程序使用的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密码数据中关注此讨论。


哇。真让我惊讶 我不知道它以纯文本存储的事实。忘记生根或不生根。如果您的设备被盗,即使您使用安全密钥锁定手机,不道德的人也很容易获得您的凭据。鉴于这一事实,您还知道任何磁盘范围的加密机制。
asudhak 2012年

1
不管它们是什么,它们都是可以用来获取该帐户访问权限的东西。但是,@ SachinShekhar 可以防止该accounts.db文件以外的其他帐户读取system
Wyzard

1
Zuul,感谢您为答案所作的努力,但我认为此答案极有误导性。如果您再次输入引号,则Gmail应用程序不会存储密码。--edit也检查@SachinShekhar答案。
2012年

2
@asudhak如果任何应用使用的是原始密码,则无法对其进行保护。黑客在找到需要存储在本地的加密/哈希密钥后,可以从accounts.db中解码编码后的字符串,因为电子邮件应用程序在将其发送到服务器之前需要此密钥来编译原始密码。
Android Quesito 2012年

2
@roxan我找不到指向Gmail应用程序存储的密码的任何内容。您可以提供报价或链接吗?
流量
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.