【问题标题】:What is the best way to save user settings in java application?在 java 应用程序中保存用户设置的最佳方法是什么?
【发布时间】:2010-09-24 06:15:52
【问题描述】:

在 Java 桌面应用程序中安全保存用户设置的最佳方法是什么?例如,如果我想保存 Ftp 帐户设置,最好的方法是什么?

谢谢

【问题讨论】:

    标签: java


    【解决方案1】:

    Preferences API 是存储用户和系统首选项的好方法。如果要存储密码,则必须对其进行加密。这是一篇不错的文章,可以帮助您入门。

    Encrypted Preferences in Java

    【讨论】:

    • 我们应该在哪里存储所需的密钥?
    • 这里有很好的介绍教程:mkyong.com/java/java-properties-file-examples
    • 我想指出,在 Windows 上,如果您使用首选项,您可能需要更改注册表。对于您的应用程序的普通用户,这可能是一个阻止程序(不行!)。
    • @ElMac:我猜你指的是臭名昭著的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。你不应该这样做。这是错误的结果。
    【解决方案2】:

    我一般存放在用户数据目录中,子目录后面是应用名称,后面是应用版本。

    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;
    } 
    

    【讨论】:

    • 但这安全吗?您是否以纯文本形式存储密码?
    • 有一种情况是以纯文本形式存储密码,而不是简单地对其进行混淆 - 混淆会产生错误的安全感。参见例如developer.pidgin.im/wiki/PlainTextPasswords
    • 在存储密码之前,我会使用jasypt.org进行加密。目前,我在我的应用程序中硬编码我的加密密钥。我曾经想过让用户指定密钥。但是,这可能会阻止普通用户使用我的应用程序,因为很难解释什么是密钥。因此,我放弃了这个想法。到目前为止,我没有收到任何关于安全问题的投诉。
    • 所以任何拥有你的程序副本的人都可以使用任何人的密钥文件?缺乏 compalints 并不能使其安全。密码被泄露的人甚至可能不知道这一事实。当然这是可行的,并且使用适当保护的机器风险很低,但实际上加密购买的很少。实际上,您的应用程序是关键,因此需要保护。
    • 我认为这是一个安全威胁。作为一个破解者可以通过反编译你的Java代码来获得硬编码的密码。
    【解决方案3】:

    安全地存储一个密码是相当困难的。假设您使用某个密钥对密码进行加密。然后,当您的应用程序再次启动时,它需要该密钥,它是从哪里获得的?

    如果它询问用户,那么他不妨输入您最初存储的 ftp 密码。如果它从某个地方读取密钥,那么您需要保护密钥,我们又回到了开始的地方。

    如果您保留多个密码,那么向用户询问某个“保险库”的单个密码可能会更加友好,但您随后就会陷入处理过期密码的所有麻烦中。

    有一些产品可以处理这种麦芽汁,如果您有严重的需求,那么您可能需要对它们进行调查。

    【讨论】:

      猜你喜欢
      • 2010-09-19
      • 2010-10-05
      • 1970-01-01
      • 2010-09-06
      • 1970-01-01
      • 2010-11-10
      • 1970-01-01
      • 2010-10-21
      • 2010-12-05
      相关资源
      最近更新 更多