2010-09-24 71 views

回答

45

Preferences API是存儲用戶和系統偏好的好方法。如果你想存儲密碼,你必須加密它們。這裏有一篇很好的文章,可以幫助你開始。

Encrypted Preferences in Java

+14

我們應該在哪裏存儲所需的密鑰? – 2010-09-24 13:22:48

+5

不錯的介紹教程在這裏:http://www.mkyong.com/java/java-properties-file-examples/ – 2013-05-29 11:41:44

+0

我想說明的是,如果您使用的是偏好設置,那麼在Windows上您可能必須更改註冊表。對於您的應用程序的普通用戶,這可能是一個阻止程序(禁止!)。 – 2016-04-06 11:29:56

25

我通常存儲在用戶數據目錄,與隨後的應用程序版本的應用程序名的子目錄。

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

但是,這是安全的嗎?您是否以純文本格式存儲密碼? – djna 2010-09-24 06:47:00

+1

存在以純文本形式存儲密碼的情況,而不是簡單地將其混淆 - 混淆會給人一種錯誤的安全感。看例如http://developer.pidgin.im/wiki/PlainTextPasswords – gustafc 2010-09-24 06:57:49

+0

在我存儲密碼之前,我將使用http://www.jasypt.org/來執行加密。目前,我在我的應用程序中硬編碼我的加密密鑰。我曾經想過讓用戶特定關鍵。但是,這可能會阻止普通用戶使用我的應用程序,因爲它很難解釋什麼是關鍵。因此,我放棄了這個想法。到目前爲止,我沒有收到有關安全問題的抱怨。 – 2010-09-24 07:09:02

13

存儲單個密碼安全是相當困難的。假設您使用某個密鑰加密密碼。那麼當你的Applciation再次開始時,它需要這個祕密密鑰,它從哪裏得到?

如果詢問用戶,那麼他可能只需輸入您首先存儲的ftp密碼。如果它從某個地方讀取密鑰,那麼你需要保密密鑰,我們又回到了我們開始的地方。

如果您保留了多個密碼,然後詢問用戶輸入某個「保險箱」的單個密碼可能會更友好,但是您隨後會遇到處理過期密碼的麻煩。

有產品可用於處理這種東西的麥汁,如果你有嚴重的需求,那麼你可能需要調查他們。

相關問題