【问题标题】:How and where to store master password for a Java desktop application如何以及在何处存储 Java 桌面应用程序的主密码
【发布时间】:2013-11-28 22:58:29
【问题描述】:

我正在开发一个将用户密码存储在 .db 文件中的小型 Java 桌面应用程序。当用户创建一个新数据库时,用户必须为该数据库创建一个主密码,以便访问他们可能选择存储在其中的任何 facebook 或 twitter 密码。我的问题是,我应该在哪里以及如何安全地存储主密码?

我的想法是加密主密码并在存储之前添加盐,然后将密码存储在加密的文本文件或 .db 文件中,然后在用户尝试访问数据库时读取它。我只是在寻找有关这是否是一个好主意或是否有更好的选择的指导。

应用程序是桌面应用程序而不是 Web 应用程序。

【问题讨论】:

  • 不是加密,而是散列...我觉得使用散列而不是加密更安全。
  • @codeMan Mhmm,你如何获得这个哈希? SHA IS 加密
  • 有很多实用程序类,只需决定一个散列算法并使用它。例如像 MD5 之类的东西
  • 如果这个应用程序完全存在于他们的桌面上,那么就不可能完全保护它。这也是 DRM 不可能的原因。如果您的源代码可以读取密码,那么知道如何读取字节码的人也可以读取密码。
  • @Cruncher 这就是为什么您使用一种方式散列(理想情况下是 salt+hash)密码而不是对其进行加密的原因......应用程序无法“读取密码” - 它只能判断用户的密码是否输入是否有效。

标签: java security encryption passwords desktop-application


【解决方案1】:

假设您有一个包含 facebook 或 twitter 密码的 .db 文件。 您以加密形式存储它们,并使用主密码作为加密密钥来加密/解密您的 .db 文件。在这种情况下,主密码由用户输入,不存储在任何地方(您可以在应用程序运行时将其保存在内存中)。要在用户尝试访问数据库时验证主密码,您可以使用它解密一些字符串常量。

【讨论】:

    【解决方案2】:

    最安全的密码存储方式是即使您(您的应用程序)也不知道密码是什么。这是通过使用单向哈希来完成的。顾名思义,这是一种方法,没有办法“取消散列”散列值并查看原始值是什么。

    加密散列的一个重要特征是散列值将总是产生相同的散列。“快速棕色狐狸跳过懒狗的 SHA-2 (256) 散列"将总是生成一个哈希d7a8fbb307d7809469ca9abcb0082e4f8d5651e46d3cdb762d02d0bf37c9e592 - 虽然没有办法获取该哈希并确定未哈希值是什么,但拥有彩虹表的黑客可以看到它对应的内容(这就是为什么弱密码,即使散列仍然容易受到攻击,世界上每个彩虹表都会有 123456 的散列)。

    因此,在对密码进行哈希处理之前,我们添加了一个盐(理想情况下,每个用户使用不同的盐)。如果在散列“The quick brown fox jumps over the lazy dog”之前我们添加一个盐(让我们只使用单词“salt”作为一个简单的例子)我们现在将散列“saltThe quick brown fox jumps over the lazy dog”并得到@ 987654323@ 作为我们的哈希。

    盐渍哈希是您应该存储的内容(无论如何/在任何对您的应用程序有意义的地方)并进行检查。因此,当用户首次创建帐户时,您将:

    1. 输入他们选择的密码并添加盐
    2. 散列(使用无冲突的加密散列,例如SHA-2
    3. 存储结果

    当用户尝试登录时,您将:

    1. 将他们输入的密码输入登录表单并添加盐
    2. 散列
    3. 将其与您存储的内容进行比较

    如果输入的密码不一样,你就知道他们输入了正确的密码,你就可以登录了。

    【讨论】:

    • 谢谢@exupery..您对存储密码的文件应该存储在哪里有任何想法吗?文件应该是什么格式,这样我也可以加密文件?
    • 如果您正在制作一个存储 Twitter 和 Facebook 密码的应用程序(正如您的问题所暗示的那样),您真的不应该存储它们,因为没有必要;您可以(并且应该)使用他们的 API(从而通过 OAuth 处理他们的身份验证)。如果您要尝试安全地存储密码,请务必记住没有绝对的安全性。文件格式无关紧要,您当然应该加密和/或混淆数据以保护不经意的观察者,但如果机器受到损害,您(和用户)应该认为数据受到损害。
    • 谢谢,我正在研究 OAuth,它似​​乎更安全
    猜你喜欢
    • 2013-05-22
    • 2016-07-26
    • 1970-01-01
    • 2014-09-09
    • 2010-09-07
    • 1970-01-01
    • 2012-01-01
    • 1970-01-01
    • 2011-04-24
    相关资源
    最近更新 更多