【发布时间】:2010-09-24 06:15:52
【问题描述】:
在 Java 桌面应用程序中安全保存用户设置的最佳方法是什么?例如,如果我想保存 Ftp 帐户设置,最好的方法是什么?
谢谢
【问题讨论】:
标签: java
在 Java 桌面应用程序中安全保存用户设置的最佳方法是什么?例如,如果我想保存 Ftp 帐户设置,最好的方法是什么?
谢谢
【问题讨论】:
标签: java
Preferences API 是存储用户和系统首选项的好方法。如果要存储密码,则必须对其进行加密。这是一篇不错的文章,可以帮助您入门。
【讨论】:
WARNING: Could not open/create prefs root node Software\JavaSoft\Prefs at root 0x80000002. Windows RegCreateKeyEx(...) returned error code 5 警告?这导致用户相信他们需要使用regedit 来创建一个新的 Win 注册表项(因为这样这个警告就会消失)。这实际上是一个bug in Java itself。你不应该这样做。这是错误的结果。
我一般存放在用户数据目录中,子目录后面是应用名称,后面是应用版本。
public static String getUserDataDirectory() {
return System.getProperty("user.home") + File.separator + ".jstock" + File.separator + getApplicationVersionString() + File.separator;
}
我已经使用以下代码 3 年了。此方法在 Windows、Linux 或 Mac 中都非常有效。
请注意,在 Windows 中,切勿将其存储在 Program Files 中,因为 Windows Vista 或更高版本中的 UAC 可能会给您带来很多麻烦。
记得在你的应用名称前加一个点,这样它就会成为 Linux 中的隐藏文件夹。
使用这种方法的好处是,您不仅限于存储原始值。相反,您可以使用xstream 将整个对象状态保存到磁盘
例如:
public static boolean toXML(Object object, File file) {
XStream xStream = new XStream();
OutputStream outputStream = null;
Writer writer = null;
try {
outputStream = new FileOutputStream(file);
writer = new OutputStreamWriter(outputStream, Charset.forName("UTF-8"));
xStream.toXML(object, writer);
}
catch (Exception exp) {
log.error(null, exp);
return false;
}
finally {
close(writer);
close(outputStream);
}
return true;
}
【讨论】:
安全地存储一个密码是相当困难的。假设您使用某个密钥对密码进行加密。然后,当您的应用程序再次启动时,它需要该密钥,它是从哪里获得的?
如果它询问用户,那么他不妨输入您最初存储的 ftp 密码。如果它从某个地方读取密钥,那么您需要保护密钥,我们又回到了开始的地方。
如果您保留多个密码,那么向用户询问某个“保险库”的单个密码可能会更加友好,但您随后就会陷入处理过期密码的所有麻烦中。
有一些产品可以处理这种麦芽汁,如果您有严重的需求,那么您可能需要对它们进行调查。
【讨论】: