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

评论

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

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

是什么导致手机上运行的任何其他软件无法获取密钥?这种方法不会增加额外的安全性

#1 楼

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。丢失设备后,只需禁用该设备即可。

更新:
从技术上讲,可以以加密/散列形式在本地存储密码,而无需在本地将加密密钥/哈希密钥保留为纯文本格式。感谢@ J.F。Sebastian指出。不幸的是,这种针对Android的实现尚不可用。从ICS开始,Android提供了KeyChain API,应用程序可以使用KeyChain API以安全的形式在本地存储密码。使用KeyChain API的应用程序很少见,但是普通的电子邮件应用程序使用它(感谢@wawa提供此信息)。因此,只要您的屏幕被锁定,您的密码在股票电子邮件应用中将是安全的。请记住,如果设备已植根并且在ICS之前的设备上不可用,则KeyChain是不安全的。

评论


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

– Lie Ryan
2012-09-12 5:56



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

– Lie Ryan
2012-09-12 9:58



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

– Lie Ryan
2012年9月12日上午10:11

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

–流程
2012-09-12 11:58



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

–Wesley Wiser
2012-09-13 18:08



#2 楼

内置电子邮件应用程序使用的Android密码以纯文本格式存储在SQLite数据库中。这与使用Sachin Sekhar的答案中所述的Auth令牌的Gmail应用程序形成对比。

对于Jelly Bean,数据库位置为:

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


以上位置因Android版本而异

此非root用户设备上的位置受操作系统的保护和保护。
在root用户设备上,用户在技术上已经被破解本身的安全性,即使它不是纯文本格式,解密也仍然是微不足道的,因为密钥必须存在于设备上的某个位置才能执行。

Android开发团队的成员发表了一个解释,直到今天仍然适用:


现在,关于这个特殊问题。首先要说明的是,电子邮件应用程序支持四种协议-POP3,IMAP,SMTP和Exchange ActiveSync-除了极少数非常有限的例外外,所有这些都是较旧的协议,它们要求客户端向服务器提供密码在每个连接上。这些协议要求我们保留密码,直到您希望在设备上使用该帐户。较新的协议没有这样做-例如,这就是为什么某些文章与Gmail形成对比的原因。较新的协议允许客户端一次使用密码来生成令牌,保存令牌并丢弃密码。

我敦促您查看注释38中链接的文章,这很好。且内容丰富。它为“模糊”密码和使其真正“安全”之间的区别提供了很好的背景。仅仅使您的密码(例如base64)模糊不清或使用存储在其他位置的密钥对其进行加密不会使您的密码或数据更加安全。攻击者仍将能够检索它。

(特别是一些其他电子邮件客户端未以明文形式存储密码的声明。即使是这样,也并不表示密码更安全。一个简单的测试:是否可以启动密码设备,它将开始在您配置的帐户上接收电子邮件,因此密码不是真正安全。它们要么被混淆,要么被存储在其他位置的另一个密钥加密。)


另外,这个问题似乎打扰了许多Android用户,您也可以在Slashdot上关注此讨论-以纯文本格式存储的Android密码数据。

评论


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

– asudhak
2012年9月11日23:14

不管它们是什么,它们都是可以用来获取该帐户访问权限的东西。但是,@ SachinShekhar,accounts.db文件受保护,不会被系统以外的帐户读取。

–蜥蜴
2012年9月12日0:34



Zuul,感谢您为回答问题付出的努力,但我认为此答案具有极大的误导性。如果您再次输入引号,则Gmail应用程序不会存储密码。 --edit检查@SachinShekhar答案。

–roxan
2012-09-12 2:52



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

–user3303
2012年9月12日上午8:46

@roxan我找不到指向Gmail应用程序未存储的密码的任何内容。您可以提供报价或链接吗?

–流程
2012年9月12日上午11:50