【问题标题】:Best way to password protect a Java console application密码保护 Java 控制台应用程序的最佳方法
【发布时间】:2019-10-09 12:01:27
【问题描述】:

我正在寻找密码保护控制台应用程序的最佳实践或标准方法。我研究了各种方法,希望对我的方法有一些反馈。

我决定使用 Argon2 对我的密码进行哈希处理,这样我只需要存储单向哈希。一切都按预期工作。我的问题是我在哪里存储哈希?它应该是硬编码的吗?我应该将它存储在一个单独的文件中并读入吗?解决此问题的最安全方法是什么?归根结底,我正在编写此应用程序来学习,并且非常想学习以正确的方式进行操作。任何相关阅读材料的链接也将不胜感激。我继续谷歌...

编辑:那么,如果我将程序密码作为哈希值存储在文件中,那么潜在的缺点是什么。用户必须知道密码才能使用该应用程序。那么让被哈希保护的程序密码作为加密密钥来保护敏感信息呢?即使源代码和/或哈希文件被操纵,敏感数据也将无法读取,因为正确的密码被用作密钥......我错过了什么?

【问题讨论】:

  • 我假设您的控制台应用程序访问了一些存储在本地文件中的数据。在这种情况下,您的重点应该放在加密(和完整性)而不是身份验证上。否则,有什么办法可以阻止某人通过其精美的身份验证绕过您的控制台应用程序并直接访问文件?这就像锁上门,但让窗户开着。加密可以基于密码,并且某些模式提供完整性检查,以便您也可以检测加密数据的更改。
  • 另外,散列很好 - 但盐和散列更好:) 编辑添加:哦,我看到 Argon2 包含盐 - 都很好!
  • 谢谢,埃里克森。您假设最终目标是保护我存储在文件中的数据是正确的。这些数据的一部分将是敏感数据,我计划对其进行加密。其中一些数据需要解密并呈现给用户。我想我的想法是通过密码保护应用程序,这将防止有人启动它并从程序内部读取数据。
  • 最终你无法解决这个问题。如果您的应用程序在用户计算机上运行,​​则用户控制您的程序所做的一切。提取和/或确定您的加密密钥相对简单。如果这只是用于玩具程序或其他不那么重要的东西,那么您的方法可能没问题。如果这需要真正的安全性 - 那么这种方法无论如何都不够。

标签: java hash cryptography


【解决方案1】:

首先,Argon2 是一个很好的密钥推导函数,用于将密码变成加密密钥。

但是,如果您使用 Argon2 哈希作为加密密钥,那么显然不要将其存储在磁盘上。如果您将加密密钥存储在加密数据旁边,您可能根本不加密。人们甚至会争辩说它更糟,因为它给人一种虚假的安全感。

如果没有密钥,正确加密的数据将毫无用处,因此您不必保护应用程序本身。如果您需要加密或解密某些内容,只需询问密码即可。您可以考虑将哈希在内存中保留一段时间,这样您就不必反复请求它,但不要持久化它。

例如,这正是 GPG 的工作原理。它不会在任何地方存储任何密码哈希。相反,它存储加密的私钥,如果需要解密私钥,只需询问密码。

【讨论】:

  • 彼得,感谢您的反馈。我不是在谈论使用哈希作为密钥。我说的是密码是关键。我想我的想法是允许用户在第一次运行时设置密码,然后使用相同的密码访问程序。密码将根据哈希进行验证,所有加密都将使用密码作为密钥。拥有哈希值将不允许您解密数据,用户必须提供密码。
  • 密码不是合适的加密密钥。这就是存在密钥派生函数的原因。 User selected passwords have very low entropy,几乎总是在 32 位以南,并且测试加密密钥很快。这使得蛮力攻击非常可行,而 KDF 通过故意减慢来应对这一点。见Key Stretching。
  • 即使您确实直接使用了密码(但实际上:不要),您也不必存储它的哈希值。如果输入正确,解密会成功,否则不会。对存储散列的额外检查根本没有做任何事情。
猜你喜欢
  • 2014-09-12
  • 1970-01-01
  • 1970-01-01
  • 2017-09-10
  • 2011-10-13
  • 2013-11-10
  • 2011-01-21
  • 2010-10-09
  • 1970-01-01
相关资源
最近更新 更多