我的asp.net web應用程序正在讀取並解密來自Global.asax的App_start事件中的XML文件的密碼。但之後我應該在哪裏存儲此密碼?將它存儲在靜態公共變量中還是應用程序對象足夠了?運行時在哪裏存儲密碼?
編輯:它是一種數據庫密碼
我的asp.net web應用程序正在讀取並解密來自Global.asax的App_start事件中的XML文件的密碼。但之後我應該在哪裏存儲此密碼?將它存儲在靜態公共變量中還是應用程序對象足夠了?運行時在哪裏存儲密碼?
編輯:它是一種數據庫密碼
如果您擔心這一點,請在Application對象中使用SecureString。但是,我不得不警告你,配置文件中的加密密碼是一個維護噩夢。你應該真的重新考慮將其以純文本形式存儲在web.config中,並拒絕訪問除sysadmins和asp.net worker進程用戶以外的所有web.config文件(可能是NETWORK SERVICE)
公共靜態屬性怎麼樣? – user137348 2009-10-19 08:20:34
是的,這顯然會更好。我不記得是什麼促使我推薦使用應用程序對象 - 我想我是在另一條評論或答案中讀到的,或者其他的東西。 :-) – Chris 2009-10-19 16:15:12
爲什麼你需要在整個會話期間的密碼?創建cookie或會話值並在用戶登錄時設置標誌。然後可以使用該值檢查用戶是否已登錄。
+1對於Cookies :-) – bastianneu 2009-10-16 14:57:29
它的數據庫密碼 – user137348 2009-10-16 15:01:38
好吧然後...沒有餅乾! – bastianneu 2009-10-16 15:03:22
將其存儲在Application
對象中。由於您在Global.asax
的Application_Start
事件中執行此操作,因此只要您需要,它就可供您的整個應用程序使用。此外,通過將其存儲在Application
對象,你是不是通過使用Cookie,視圖狀態暴露在客戶端等
// set it
Application["MyPassword"] = myDecryptedPassword;
而且在應用程式中的其他地方找回它:
// get it
string myDecryptedPassword = Application["MyPassword"].ToString();
公共靜態屬性呢? – user137348 2009-10-19 08:21:05
爲什麼需要輸入密碼?將它以純文本形式存儲在web.config中的連接字符串中是不可行的?
您可以存儲密碼在Application對象中。
但是,我個人的偏好是爲Global類添加一個公共靜態屬性來訪問應用程序級數據。這將爲您提供Intellisense支持,爲您提供安全類型(例如,您可能會「不小心」在Application對象中使用另一種類型的數據覆蓋您的密碼),並且稍後可以更輕鬆地維護您的應用程序。
SecureString是你在找什麼。
永遠不要使用簡單的字符串對象,因爲它沒有加密,並且可以在不同的垃圾回收機制下存活,這意味着您的密碼將長時間在整個內存中飛行,除非您動態分配,否則無法控制它GB一代,這可能是相當邪惡的。相反,SecureString會在不再使用時自動刪除。
另一方面,當在web.config中存儲密碼時總是加密密碼。你可以使用aspnet_regiis.exe來做到這一點。 (它是作爲.NET Framework工具的一部分)。
因此,假設您將密碼存儲在名爲「DBAccessPassword」的xml元素中,加密命令看起來像這樣。
aspnet_regiis.exe -pe "DBAccessPassword" -app "/yourApp"
這是一個非常有用的技術,能真正使區別,如果,例如,你的應用程序很容易受到Path Traversal Vulnerability。加密密碼總是一個好主意,因爲它爲您的應用程序增加了一層額外的安全性。
表演
ASPNET_REGIIS默認使用RSA。 RSA是一種不對稱算法,因此,根據檢索密碼的時間長短,可能會導致性能問題。對稱密鑰算法通常比非對稱密鑰算法計算密集得多。實際上,非對稱密鑰算法通常比對稱密鑰算法慢數百到數千倍。
根據您的應用程序的類型,您還可以考慮使用不同的算法。
此密碼的用途是什麼,你需要明文嗎? – 2009-10-16 14:57:35
其數據庫密碼 – user137348 2009-10-16 15:00:48
你如何與你的數據庫交互? ADO.NET? LINQ? – 2009-10-16 15:02:28