什么是在Java桌面应用中安全地保存用户设置的最佳方式?例如,如果我想保存FTP帐户设置,最好的方法是什么?
谢谢
什么是在Java桌面应用中安全地保存用户设置的最佳方式?例如,如果我想保存FTP帐户设置,最好的方法是什么?
谢谢
Preferences API 是一种存储用户和系统偏好设置的好方法。如果您想要存储密码,您需要将它们加密。这篇文章可以帮助您入门。
我通常将数据存储在用户数据目录中,应用程序名称后跟应用程序版本的子目录中。
public static String getUserDataDirectory() {
return System.getProperty("user.home") + File.separator + ".jstock" + File.separator + getApplicationVersionString() + File.separator;
}
我已经使用以下代码三年了。这种方法在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密码时输入密码。如果它从某处读取秘密密钥,则需要保护秘密密钥,我们又回到了起点。
如果您保存了多个密码,则要求用户为某个“保险库”提供一个密码可能更加友好,但接下来您将面临处理过期密码的所有麻烦。
有一些产品可供处理此类事情,如果您有严重的需求,则可能需要调查它们。