[英]How and where to store master password for a Java desktop application
我正在開發一個將用戶密碼存儲在 .db 文件中的小型 Java 桌面應用程序。 當用戶創建新數據庫時,用戶必須為該數據庫創建一個主密碼,以便訪問他們可能選擇存儲在其上的任何 facebook 或 twitter 密碼。 我的問題是,我應該在哪里以及如何安全地存儲主密碼?
我的想法是加密主密碼並在存儲之前添加鹽,然后將密碼存儲在加密文本文件或 .db 文件中,然后在用戶嘗試訪問數據庫時讀取它。 我只是在尋找有關這是否是一個好主意,或者是否有更好的替代方案的指導。
該應用程序是桌面應用程序,而不是 Web 應用程序。
存儲密碼最安全的方式是,即使您(您的應用程序)也不知道密碼是什么。 這是通過使用單向散列來完成的。 顧名思義,這是一種方式,無法“取消散列”散列值並查看原始值是什么。
加密散列的重要特征之一是對一個值進行散列總是會產生相同的散列。“The quick brown fox jumps over the lazy dog”的 SHA-2 (256) 散列總是會生成一個散列d7a8fbb307d7809469ca9abcb0082e4f8d5651e46d3cdb762d02d0bf37c9e592
無法獲取散列並確定未散列的值是什么 擁有彩虹表的黑客可以看到它對應的內容(這就是為什么弱密碼,即使散列仍然容易受到攻擊,世界上每個彩虹表都會有123456的哈希值)。
所以在對密碼進行散列之前,我們添加一個鹽(最好為每個用戶添加不同的鹽)。 如果在散列“The quick brown fox jumps over the lazy dog”之前我們添加了一個鹽(讓我們只使用單詞“salt”作為一個簡單的例子),我們現在將散列“saltThe quick brown fox jumps over the lazy dog”並得到b369837c6389d8dddb06cb669961b0ab80f5166cc8cebcfaf9734ed009c31e8b
作為我們的哈希。
鹽漬散列是您應該存儲的內容(無論如何/在任何對您的應用程序有意義的地方)並檢查。 因此,當用戶首次創建帳戶時,您將:
當用戶嘗試登錄時,您將:
如果不相同,他們輸入了錯誤的密碼,如果相同,您知道他們輸入了正確的密碼,您可以登錄。
假設您有一個 .db 文件,其中包含 facebook 或 twitter 密碼。 您以加密形式存儲它們,並使用主密碼作為加密密鑰來加密/解密您的 .db 文件。 在這種情況下,主密碼由用戶輸入,不會存儲在任何地方(您可以在應用程序運行時將其保存在內存中)。 要在用戶嘗試訪問數據庫時驗證主密碼,您可以用它解密一些字符串常量。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.