2013-02-04 78 views
4

在計算機上保存密碼以便不能被訪問的最佳方法是什麼?我想將它們存儲在註冊表中加密。我希望您能夠重置密碼,但這不適用於服務器。這是爲了將它們存儲在計算機上以記住它們並自動登錄。安全存儲密碼的最佳方法

重要編輯:我需要能夠從程序內檢索純文本密碼,而不是其他任何地方。

+2

http://stackoverflow.com/questions/1054022/best-way-to-store-password-in-database/ –

+0

請張貼使用答題按鈕,而不是在評論的答案。 –

+0

呃,不!這是一個鏈接。點擊它很容易... –

回答

3

CryptProtectDataCryptUnprotectData是你在Windows上最好的選擇。他們使用登錄憑據加密數據,因此密碼可以安全地抵禦磁盤的攻擊。但是,可以通過在同一用戶下運行的任何程序訪問它們。我建議將它們存儲在一個文件中,該文件的權限可以防止其他程序訪問它們(例如需要管理員權限才能訪問的文件)。

託管類ProtectedData使用這些函數,因此它可以從C#中使用。

您也可以直接使用這些函數使用P/Invoke。有一些示例代碼完全符合here

擴張響應的附加要求:

有一種方法,以確保你的程序是唯一一個能夠不需要你的程序使用管理員權限啓動訪問密碼,但它會佔用大量的更多的工作。

其基本思想是:您創建一個Windows服務,當您安裝您的應用程序時安裝。當它想要存儲/檢索用戶的密碼時,應該從應用程序的需求啓動。該服務僅提供對設置了權限的文件的讀/寫訪問權限,以便只有管理員才能讀取/寫入權限。額外的安全來自IPC連接到該進程,該進程將使用Named Pipe。然後您可以使用GetNamedPipeClientProcessId(對不起,您需要P/Invoke)通過查看連接到管道的客戶端的進程ID來驗證請求。

如果您有權訪問有效證書,則可以使用代碼簽名來驗證進程ID,具體取決於您對安全性的擔憂程度。或者,您可以驗證可執行文件的校驗和或某種性質。

這是我能想到的創建您在Windows上尋找的安全性的唯一方法。在將應用程序交給Windows服務以防止硬盤攻擊之前,您的應用程序還應該使用ProtectedData來加密數據。

+0

有沒有一種管理方式在.NET中做到這一點? –

+0

我的程序不應該需要管理員權限才能打開密碼文件...並且只能通過程序訪問。 –

+2

Windows的權限模式不支持此功能。如果您的程序可以在沒有獲得額外權限的情況下訪問它,則作爲同一用戶運行的任何程序都可以訪問它。 –

-1

我相信我在找的是AES。這似乎是一種存儲密碼的簡單方法。當然,這僅僅是爲了記住計算機上的密碼,所以用戶不必輸入密碼。

http://en.wikipedia.org/wiki/Advanced_Encryption_Standard

+1

問題是,這隻會將問題轉移到您想要存儲AES密鑰的位置。這個問題沒有很好的解決方案,但是'CurrentUser'保護範圍的'ProtectedData'最接近。用AES來構建自己的東西可能不是一個好主意。 – CodesInChaos

+0

我可能會將密鑰硬編碼到程序中。這是不安全的嗎?如果程序被拆卸,有人能夠弄清楚密鑰? –

+0

我打算去看看它。我會對AES進行一些研究,看看會發生什麼。 –