2009-10-16 140 views
0

我的asp.net web應用程序正在讀取並解密來自Global.asax的App_start事件中的XML文件的密碼。但之後我應該在哪裏存儲此密碼?將它存儲在靜態公共變量中還是應用程序對象足夠了?運行時在哪裏存儲密碼?

編輯:它是一種數據庫密碼

+1

此密碼的用途是什麼,你需要明文嗎? – 2009-10-16 14:57:35

+0

其數據庫密碼 – user137348 2009-10-16 15:00:48

+0

你如何與你的數據庫交互? ADO.NET? LINQ? – 2009-10-16 15:02:28

回答

6

如果您擔心這一點,請在Application對象中使用SecureString。但是,我不得不警告你,配置文件中的加密密碼是一個維護噩夢。你應該真的重新考慮將其以純文本形式存儲在web.config中,並拒絕訪問除sysadmins和asp.net worker進程用戶以外的所有web.config文件(可能是NETWORK SERVICE)

+0

公共靜態屬性怎麼樣? – user137348 2009-10-19 08:20:34

+0

是的,這顯然會更好。我不記得是什麼促使我推薦使用應用程序對象 - 我想我是在另一條評論或答案中讀到的,或者其他的東西。 :-) – Chris 2009-10-19 16:15:12

1

爲什麼你需要在整個會話期間的密碼?創建cookie或會話值並在用戶登錄時設置標誌。然後可以使用該值檢查用戶是否已登錄。

+0

+1對於Cookies :-) – bastianneu 2009-10-16 14:57:29

+0

它的數據庫密碼 – user137348 2009-10-16 15:01:38

+0

好吧然後...沒有餅乾! – bastianneu 2009-10-16 15:03:22

5

將其存儲在Application對象中。由於您在Global.asaxApplication_Start事件中執行此操作,因此只要您需要,它就可供您的整個應用程序使用。此外,通過將其存儲在Application對象,你是不是通過使用Cookie,視圖狀態暴露在客戶端等

// set it 
Application["MyPassword"] = myDecryptedPassword; 

而且在應用程式中的其他地方找回它:

// get it 
string myDecryptedPassword = Application["MyPassword"].ToString(); 
+0

公共靜態屬性呢? – user137348 2009-10-19 08:21:05

0

爲什麼需要輸入密碼?將它以純文本形式存儲在web.config中的連接字符串中是不可行的?

0

您可以存儲密碼在Application對象中。

但是,我個人的偏好是爲Global類添加一個公共靜態屬性來訪問應用程序級數據。這將爲您提供Intellisense支持,爲您提供安全類型(例如,您可能會「不小心」在Application對象中使用另一種類型的數據覆蓋您的密碼),並且稍後可以更輕鬆地維護您的應用程序。

0

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是一種不對稱算法,因此,根據檢索密碼的時間長短,可能會導致性能問題。對稱密鑰算法通常比非對稱密鑰算法計算密集得多。實際上,非對稱密鑰算法通常比對稱密鑰算法慢數百到數千倍。

根據您的應用程序的類型,您還可以考慮使用不同的算法。

相關問題