2011-03-19 133 views
14

我正在创建一个应用程序来存储加密数据。存储密码

this问题中,OP si建议清楚地存储用户的凭证。

但是如果我想存储使用SecretKeySpec(用于加密数据的密码)创建的加密密码呢?根据我的理解,密钥本身就是加密的。

所以我可以存储和检索它。

注意:我不问如何存储首选项,就像我理解SecretKeySpec的工作方式以及如何排序和检索加密密码一样。

编辑:对不起,我忘了指定它需要与API级别4

回答

11

直接从developer website

智能关于安全!

了解AccountManager不是加密服务或钥匙串很重要。它以纯文本格式存储帐户凭证,就像您传递它们一样。在大多数设备上,这不是一个特别的问题,因为它将它们存储在只能由root用户访问的数据库中。但是,在有根的设备上,任何具有adb设备访问权限的人都可以读取凭证。

考虑到这一点,您不应该将用户的实际密码传递给AccountManager。addAccountExplicitly()。相反,您应该存储一个加密安全的令牌,该令牌对攻击者的使用有限。如果你的用户凭证保护着有价值的东西,你应该仔细考虑做类似的事情。

请记住:当涉及到安全代码,请按照“Mythbusters”规则:不要在家中尝试这个!在实施任何自定义帐户代码之前咨询安全专家。

既然安全免责声明已经完成,现在是时候重新开始工作了。您已经实施了自定义帐户代码的功能;剩下的就是管道。

6

哇兼容。我真的不认为将用户的密码保存在明文中是一个严肃的选择。

检出AccountManager这是专为此目的而设计的。虽然它在你所关联的问题中被压低了,SampleSyncAdapter真的是一个AccountManager例子的好资源,也是我知道的SDK中唯一的一个。

编辑 - 约javax.crypto,我认为它是一个比AccountManager更低级别的API。从文档:

许多服务器支持 认证令牌,可用于不发送用户的实际 密码验证到 服务器发出请求 的一些概念。 (验证令牌 通常与单独的 请求其不包括该用户的凭证 创建。)的AccountManager可以 产生用于应用程序身份验证令牌, 因此应用程序不需要 手柄密码直接。 Auth令牌 通常可重复使用并由Account Manager管理,但必须定期更新 。这是应用程序的责任 当他们停止工作时使auth 令牌失效,因此AccountManager知道它需要 重新生成它们。

我讨厌在javax.crypto的级别上处理这个问题,如果我不需要的话。

+0

听起来不错。很好。但我需要保持与API级别4(我编辑的问题,对不起)保持兼容。无论如何+1 – 2011-03-19 09:29:28

-4

U可以简单地声明这两个用户名和密码的if语句,如果条件匹配u能在错误的情况下启动活动u能简单地生成的错误举杯input.but你无法如果u从那里retreive密码失去任何意思,但是你可以为一个用户创建许多密码。我将这个东西添加到我的应用程序中,并为我工作得很好。