2016-02-29 69 views
-2

有誰知道如何在文本文件中安全地存儲密碼。我有一個VS的C#本地應用程序與登錄窗口,我需要存儲用戶密碼。我知道哈希和加密,但問題是任何人都可以刪除密碼文件或更改其中的數據。有什麼辦法可以解決這個問題嗎?我的攻擊者模型是具有管理員權限的用戶。應用程序密碼的完整性

謝謝大家!我已經通過運行使文件保持打開狀態的服務來解決問題,因此除非關閉服務,否則無法編輯或刪除它。這不是我想的最好的解決方案,但它工作。

+0

加密並將其存儲在數據庫存儲在文件中沒有在我看來非常安全的.. – MethodMan

+0

你不能......你無法控制用戶將如何處理系統中的文件。 –

+2

您不能信任攻擊者可以修改的數據。你的威脅模型是什麼? – SLaks

回答

0

像其他人一樣,這取決於您的威脅模型。如果本地存儲的密碼將用於驗證任何內容,則需要對其進行加密,並存儲在加密的數據庫/文件中。

您是否在本地存儲此密碼以保存遠程登錄的用戶密碼?

或者您是否存儲此密碼以實際驗證用戶登錄數據? (一般你不想這樣做,因爲正如其他人所說,你不能信任用戶端的文件。)

最好的解決方案是使用遠程服務器來存儲密碼,並驗證登錄數據。

但是..

沒有一個適合所有安全模型的尺寸。這取決於您的需求,用戶需求,您提供的服務類型以及相應的應用程序所需的安全級別。 (的MSN聊天帳戶不需要相同的安全性作爲銀行登錄

你原來的問題是如何防止本地密碼文件的用戶編輯:

你需要加密文件保存時。 (也使用sha256散列存儲的密碼,使用鹽)

然後在您的應用程序中解密密碼文件(在內存中),然後從您的應用程序中讀取密碼哈希值。除此之外,您還可以遠程保存文件/密碼的解密密鑰/鹽。您的應用程序需要互聯網訪問才能獲取密鑰/鹽,然後解密本地文件/密碼。

更多的閱讀&代碼引用:

Encrypting Files in C-Sharp

Sha256 Hashing with Salt in C-Sharp

Using Remote SQL Databases in C-Sharp

+0

1.您將在哪裏保存加密文件的加密密鑰?這移動了祕密但增加了工作因素。 2.「你不能信任用戶端的文件」,但你不能相信它們在服務器端!服務器至少需要雙因素身份驗證,並對第二個因素進行良好控制。 – zaph

+0

這取決於應用程序的安全級別。對於非常安全的事情,你不應該在本地存儲任何密碼數據。如果安全性沒有被優先考慮,您可以將(加密的密碼)作爲(加密的字符串)存儲在(加密文件中)。 使用存儲爲靜態字符串的(用於解密本地文件和密碼的密鑰)應用程序。 (這很容易被拆卸。)但是,嘿,這個應用程序不是一個銀行賬戶,對不對? – Jscix

+0

我同意增加工作因子。在某些平臺上,反彙編只能通過制動設備,安裝黑客工具,執行應用程序並檢查內存中的代碼來完成。 – zaph

0

擴大zaph評論:使用散列。

通過良好的散列函數(SHA2)運行用戶密碼並存儲散列。

當使用輸入密碼並且您想要檢查它時,請通過相同的散列函數運行它們的輸入並查看是否得到相同的散列。

這是更安全的,因爲你沒有存儲的東西,可以改回密碼和被盜

+0

幾乎,但不使用散列函數,請使用HMAC或更好的PBKLDF2或bcrypt。如果你能保持鹽的祕密(或者至少難以獲得),攻擊者很難替換文件中的條目。 – zaph