我正在创建一个用于存储加密数据的应用。
在this问题中,OP si建议明确存储用户的凭证。
但是,如果我想存储使用SecretKeySpec(用于加密数据的密码)创建的加密密码,该怎么办?根据我的理解,密钥本身是加密的。
所以我可以存储和检索它。
注意:我不是在询问如何存储首选项,只要我了解SecretKeySpec如何工作以及如何,排序,序列化和检索加密密码。
编辑:抱歉,我忘了指定它需要与API级别4兼容。
答案 0 :(得分:11)
直接来自developer website。
聪明一点安全!
了解AccountManager不是加密服务或钥匙串非常重要。它以正文传递的方式存储帐户凭据。在大多数设备上,这不是特别关注的问题,因为它将它们存储在只能由root访问的数据库中。但是在root设备上,任何拥有adb访问权限的人都可以读取凭据。
考虑到这一点,您不应将用户的实际密码传递给AccountManager.addAccountExplicitly()。相反,您应该存储对攻击者有限使用的加密安全令牌。如果您的用户凭据保护了有价值的东西,您应该仔细考虑做类似的事情。
请记住:说到安全代码,请遵循“流言终结者”规则:不要在家里试试!在实施任何自定义帐户代码之前,请咨询安全专业人员。
现在安全免责声明已经不在了,现在是时候重新开始工作了。您已经实现了自定义帐户代码的内容;剩下的就是管道。
答案 1 :(得分:6)
哇。我真的不认为以明文形式存储用户的密码是一个严肃的选择。
查看专为此目的而设计的AccountManager。虽然它在您链接的问题中被忽略了,但SampleSyncAdapter确实是AccountManager
示例的一个很好的资源,而且我知道SDK中包含的唯一一个。{/ p>
修改 - 关于javax.crypto
,我认为它是一个比AccountManager
更低级别的API。来自文档:
许多服务器都支持某种概念 身份验证令牌,可以是 用于验证对请求的请求 服务器没有发送用户的 实际密码。 (Auth代币是 通常与单独创建 请求包括用户的 凭证。)AccountManager可以 为应用程序生成auth令牌, 所以应用程序不需要 直接处理密码。 Auth令牌 通常可以重复使用并缓存 AccountManager,但必须刷新 定期。这是责任 应用程序使auth无效 令他们停止工作时的代币 AccountManager知道它需要 重生它们。
如果我不需要,我讨厌在javax.crypto的层面处理这个问题。
答案 2 :(得分:-4)