关于安全性:如何在桌面客户端应用程序(Java)中存储密码和敏感数据?

How to store passwords and sensitive data in a desktop client application (Java)?

我想制作一个应用程序,它将监控用户的电子邮件帐户接收电子邮件,以及他的Twitter帐户的tweets。因此,用户必须提供登录凭据。我的疑问是如何和在哪里存储这些敏感数据?我不希望我的应用程序打扰用户反复询问这些问题。

此外,如果我应该加密然后存储这些数据,那么我应该如何保护我在应用程序中使用的密钥?


加密的目的是使明文的保密性依赖于较小密钥的保密性。

在这种情况下,加密对您来说是无用的,因为您也没有办法存储密钥。

相反,您需要使用由第三方管理的一些现有秘密(使用密码),并使用它来派生密钥。

在Windows上,您可以使用DPAPI,它最终由用户的登录密码支持。如果用户忘记了密码(或者密码是从其他帐户更改的),您的数据将无法恢复地丢失。

请注意,这不会针对以该用户身份运行的代码进行防御。你需要决定你要防御的是什么。


如果你真的需要它(这不是个好主意,但是…)你可能想要为密码创建加密存储,比如火狐。用户将使用主密码保护密码。


我认为使用的密码是你的应用程序范围,并使用该密码加密所有其他密码,当应用程序说需要Twitter时,使用该密码解密…进一步将主密码的盐散列保存到磁盘上。


答案是无处可寻。您不应该以加密的形式存储密码。"正确"的方法可能是模拟类似Web应用程序的行为。实际上,如果你登录Twitter,你可以选择"记住我"复选框,Twitter下次不会要求你输入密码,对吗?如何实施?

通常,特殊令牌存储在客户机端的cookie中。cookie被发送到服务器并用于身份验证。cookie有过期日期,所以当它的时间结束时,它将被自动删除。

除非桌面应用程序有更好的解决方案,否则我建议您尝试使用这种机制。