我正在开发一个小型Java桌面应用程序,用于将用户密码存储在.db文件中。当用户创建新数据库时,用户必须为该数据库创建主密码,以便访问他们可能选择存储在其上的任何facebook或twitter密码。我的问题是,我应该在哪里以及如何安全地存储主密码?
我的想法是加密主密码并在存储之前添加一个盐,然后将密码存储在加密的文本文件或.db文件中,然后在用户尝试访问数据库时读取它。我只是在寻找关于这是一个好主意的指导,还是有更好的选择。
p.s应用程序是桌面应用程序而不是Web应用程序。
亲切的问候
答案 0 :(得分:1)
存储密码的最安全方式是即使您(您的应用)也不知道密码是什么。这是通过使用单向散列来实现的。顾名思义,这是一种方法,没有办法“解散”散列值,看看原始值是什么。
加密哈希的一个重要特征是散列一个值总是产生相同的散列.SHA-2(256)哈希“快速的棕色狐狸跳过懒狗“总是生成一个哈希d7a8fbb307d7809469ca9abcb0082e4f8d5651e46d3cdb762d02d0bf37c9e592
- 虽然没有办法获取该哈希值并确定未使用的值是一个带有彩虹表的黑客可以看到它对应的内容(这是为什么弱密码,即使在散列时仍然很脆弱,世界上每个彩虹表都会有 123456 的散列。
因此,在对密码进行散列之前,我们会添加一个盐(理想情况下每个用户使用不同的盐)。如果在哈希之前“快速的棕色狐狸跳过懒狗”,我们添加一个盐(让我们只使用“盐”这个词作为一个简单的例子)我们现在哈希“盐快速的棕色狐狸跳过懒狗”并得到{ {1}}作为我们的哈希。
盐渍哈希是您应该存储的内容(无论何处/对您的应用程序有意义)并检查。因此,当用户首次创建帐户时,您将:
当用户尝试登录时,您将:
如果它不相同,则输入的密码不正确,如果它们相同,您知道他们输入了正确的密码,您可以将其登录。
答案 1 :(得分:0)
假设您有一个包含facebook或twitter密码的.db文件。 您以加密形式存储它们并使用主密码作为加密密钥来加密/解密.db文件。在这种情况下,主密码由用户输入,不存储在任何地方(您可以在应用程序运行时将其保存在内存中)。要在用户尝试访问数据库时验证主密码,您可以使用它解密一些字符串常量。