2009-09-27 113 views
5

我正在編寫一個應用程序,需要讀取用戶名和密碼並將它們存儲起來,以便以後程序可以再次讀取它們。將它存儲在一些變量中聽起來像一個愚蠢的想法。在應用程序內保存密碼

發現KDE library,但它有太大的依賴性,我太新手程序員瞭解如何使用它。

什麼是常見的存儲密碼的方法,以及我如何解決我的問題?

回答

7

這取決於你將如何處理這些信息。

如果您打算使用名稱和密碼來訪問某些外部服務(但下次運行該程序時用戶將不得不重新輸入信息),則將它們存儲在某些變量中即可。將它們加密存儲(至少需要存儲加密的密碼)可能是明智的做法,以便在覈心轉儲或等價物中不可見。當需要密碼時,您解密它,使用它,然後在解密版本的存儲位置(切換它)進行寫入。 (注意:散列在這種情況下是不合適的;您需要能夠看到密碼,並且不能撤消散列。)您可以決定將信息存儲在程序之外(在磁盤文件中),但它似乎沒有必要。請注意,二進制文件仍然包含加密密鑰(和加密算法),並且加密數據比程序的平均內容更隨機,因此真正隱藏加密密碼實際上非常困難(不可能接近)。但是,你可以讓它變得很難,它會阻止除最堅決的攻擊者之外的所有攻擊者。

如果您打算將用戶名和密碼存儲爲永久記錄,以便您可以驗證同一用戶將來訪問該信息,那麼您必須使用該程序外部的存儲;您將使用簡單的數據庫,如果您確保解決任何併發問題,則該數據庫可能與純文本文件一樣簡單。在這種情況下,您將使用一些salt對密碼進行哈希處理,您將以給定用戶名的方式存儲用戶名,salt和散列密碼,您可以輕鬆找到其他兩個值。


夜沃克評論:

我使用該密碼訪問某些網站數據庫,所以我需要它存儲在我的應用程序是爲進入後的第一次。你確定一個純文本文件是一個聰明的想法嗎?

這取決於你如何構想'存儲在我的應用程序'。你不能修改可執行文件,或者至少不應該這樣做。所以,你需要將它看作是存儲在與應用程序可執行文件分開的某種文件中的永久記錄。另一方面,您確實遇到了與我所概述的不同的問題 - 您沒有使用信息驗證用戶身份;您需要解密信息按需發送到其他應用程序。

首先,這意味着鹽和散列不相關;您需要反轉屏蔽操作,並且不能反轉散列。

接下來,您需要決定如何在再次出現時識別應用程序的用戶。用戶是否有義務輸入一些密碼來獲取他們自己的數據,或者您是否僅僅依賴操作系統權限或其他方案。

如果用戶必須在應用程序中輸入一些密碼才能開始使用,那麼您可以考慮使用該密碼(或其散列,與用於識別應用程序密碼的密碼散列不同)來加密用戶名/外部應用程序的密碼組合。然後,您可以將用戶名和出於參數的原因,將加密密碼的Base-64編碼版本存儲到文本文件中;這與應用程序密碼一樣安全,它以原始的鹽漬散列格式存儲。當用戶返回時,他們必須提供他們的應用程序用戶名和密碼,並且可以根據存儲的值驗證該組合,然後使用密碼將密碼解密到外部應用程序。

如果用戶沒有輸入密碼,那麼您在做什麼時會受到更多的限制。您必須能夠根據您可用的信息以某種方式確定密鑰,這些信息可用於將用戶的加密密碼存儲在受限位置(例如其主目錄下的子目錄中的一個文件中)中,該組無法進行組或公共訪問:

mkdir ~/.appname 
chmod 700 ~/.appname 
cp /dev/null ~/.appname/app.key 
...store the encrypted information... 
chmod 500 ~/.appname 
chmod 400 ~/.appname/app.key 

這是不太令人滿意的,因爲即使你把用戶的名字固定密鑰,比方說,有機會,有人能制定出關鍵是什麼(加密技術)和反向工程了。 (加密數據的保密性取決於密鑰;當密鑰可由程序確定時,它也可由確定的攻擊者確定。最好依靠用戶提供密鑰(或密碼或在運行時密碼短語);然後在應用程序不存儲任何攻擊者可以利用離線

+0

我使用該密碼訪問某些Web數據庫,所以我需要它在第一次輸入後存儲在我的應用程序中。 你確定純文本文件是這個聰明的想法嗎? – 2009-09-27 21:15:51

+0

所以我認爲它永久記錄是迄今爲止最好的想法。 該應用程序沒有任何其他密碼,並且不測量其他用戶將使用該應用程序。 唯一的辦法就是嘗試保存其他人員的密碼+用戶名。 – 2009-09-27 22:33:26

+0

是的,將信息存儲在某個永久文件中將是必要的。爲應用程序的每個用戶使用一個單獨的文件;以Base-64編碼存儲加密的密碼(所以你有一個純文本文件)。從你認爲是用戶最可靠的特徵(可能是他們的用戶名和用戶ID號的連接,也可能是一些固定的文本)的密碼散列中推導用於加密的密鑰,並將其存儲爲安全你可以設計一個位置。安全性不夠完美 - 你可以設計出你的攻擊者可以發現的東西。 – 2009-09-27 22:43:48

0

是什麼樣的應用程序呢?有許多方法,但如果它的ASP.Net通常在web.config文件中進行加密。

+0

它是跨平臺的c + +應用程序(不是一些網絡小程序) – 2009-09-27 20:54:07

5

通常您會存儲密碼的用戶名和散列版本。看到這篇維基百科文章:hash functions,和這question

+2

如果您以後需要使用實際的密碼登錄到遠程系統或類似的東西,密碼的哈希將無法幫助。 – 2009-09-27 21:32:47

+0

絕對..... – Peter 2009-09-28 02:35:14

1

什麼MySQL或SQLite的散列密碼,並將它們存儲在持久性的數據庫,沒有

1

常見。?存儲密碼以供將來使用的方法是將它們存儲在某些加密緩存中,該緩存使用一些主密碼加密,每次需要緩存密碼時都應輸入主密碼KeePassX是一個小型的開源應用程序,它使用主密碼存儲個人數據(用戶名稱,p密碼等)。它有一個輕便的界面,是跨平臺的,並根據GNU通用公共許可證的條款發佈。你可以檢查它作爲樣本,並使用它的一些部分。

0

在spotep.com我們只存儲用戶名和用戶名和密碼組合的哈希碼。這樣做的好處是similair(通常微不足道的)密碼不會導致相同的哈希碼(存儲在cookie中,因此非常不安全)。

+0

不錯的網站,但你錯過了很多系列 迦太基,太空堡壘卡拉狄加,無政府狀態的兒子等...... – 2009-09-27 23:38:44

+0

嗯,不,我們不? – 2009-12-23 09:22:49

1

我建議在SQLite中存儲散列密碼。然後,無論何時您需要檢查密碼,將其加以散列,然後將其與存儲的值進行比較。這使得存儲的密碼保持安全,所以沒有人(甚至你)不知道它們是什麼。

1

您可以嘗試QSettings,它提供了持久的平臺無關的應用程序設置。像mysql這樣的解決方案會過度殺傷,除非你有數百個密碼來存儲。