【问题标题】:Storing a password存储密码
【发布时间】:2011-03-19 01:30:58
【问题描述】:

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

this 问题中,OP si 建议以明文形式存储用户的凭据。

但是,如果我想存储使用 SecretKeySpec(用于加密数据的密码)创建的加密密码,该怎么办?据我了解,密钥本身是加密的。

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

注意:我不是在问如何存储首选项,只是我对 SecretKeySpec 的工作原理以及如何序列化和检索加密密码的理解。

编辑:抱歉,我忘记指定它需要与 API 级别 4 兼容。

【问题讨论】:

    标签: android encryption


    【解决方案1】:

    直接来自developer website

    注意安全!

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

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

    记住:当涉及到安全代码时,请遵循“流言终结者”规则:不要在家里尝试这个!在实施任何自定义帐户代码之前,请咨询安全专家。

    现在安全免责声明已经结束,是时候重新开始工作了。您已经实现了自定义帐户代码的核心;剩下的是管道。

    【讨论】:

      【解决方案2】:

      哇。我真的不认为明文存储用户密码是一个严肃的选择。

      查看专为此目的设计的AccountManager。尽管它在您链接到的问题中被否决了,但 SampleSyncAdapter 确实是 AccountManager 示例的好资源,也是我所知道的 SDK 中唯一包含的资源。

      编辑 - 关于javax.crypto,我认为它是比AccountManager 更低级别的API。来自文档:

      许多服务器都支持某种概念 身份验证令牌,可以是 用于验证对 服务器不发送用户的 实际密码。 (身份验证令牌是 通常使用单独的创建 包含用户的请求 凭据。)AccountManager 可以 为应用程序生成身份验证令牌, 所以应用程序不需要 直接处理密码。身份验证令牌 通常可重用和缓存 AccountManager,但必须刷新 定期。这是责任 使身份验证无效的应用程序 停止工作时的令牌,因此 AccountManager 知道它需要 重新生成它们。

      如果我没有必要,我不想在 javax.crypto 级别上处理这个问题。

      【讨论】:

      • 听起来不错。很好。但我需要与 API 级别 4 保持兼容(我编辑了问题,抱歉)。无论如何+1
      【解决方案3】:

      如果条件匹配,你可以简单地将用户名和密码声明为 if 语句你可以在错误的情况下启动活动你可以简单地生成错误输入的祝酒词。但是如果你丢失了任何密码,你不能从那里检索密码意思是,但是是的,你可以为单个用户创建多个密码。我将这个东西添加到我的应用程序中并且对我来说效果很好。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-04-18
        • 2010-09-08
        • 2012-05-31
        • 1970-01-01
        • 1970-01-01
        • 2015-10-19
        • 2014-06-23
        相关资源
        最近更新 更多