這可能聽起來像是一個可怕的想法乍一看,但這裏是我的情況:我有一個Windows服務,使用用戶名認證公開幾個WCF端點。自定義身份驗證器將在本地數據庫中查找用戶的憑據(密碼存儲爲鹽漬SHA-1),或者它將向另一個服務發出WCF請求以驗證密碼。 (在User對象上有一個枚舉,可以是Internal或External,指示使用哪個驗證源)。緩存WCF服務內存中的明文密碼
我發現執行查找+哈希檢查或使WCF調用對我的服務的每個請求都很昂貴,所以我想緩存用戶名/密碼信息。緩存中的每個項目都有一個生命週期,例如,如果緩存中的項目的時間爲60秒,則在下一次請求時,身份驗證器將根據原始源代替緩存驗證憑據,然後進行更新。
對於本地數據庫,我可以簡單地將用戶名/ SHA1對存儲在字典中,並且在來自「內部」用戶的每個請求中,我只需重新提供散列提供的密碼並進行比較。對於「外部」用戶,我只會將明文密碼提交給驗證器,所以我將它放在哈希中並將其存儲爲緩存的一部分。儘管這肯定節省了數據庫請求或遠程服務調用的開銷,但我仍然必須每次都執行哈希操作。
有問題的服務將運行在具有良好物理和網絡安全性的內部服務器上。將明文密碼存儲在緩存中而不是存儲散列版本是否可接受?在這種情況下,我的風險似乎是攻擊者傾倒進程內存並獲取密碼。如果我認爲風險可以接受,是否還有其他原因,我應該避免在內存中使用明文密碼?
如果我選擇使用明文密碼,我認爲SecureString可以在一定程度上限制我的風險。使用SecureString(實現它看起來非常迂迴)是否值得遇到麻煩?我很清楚持久存儲密碼的風險,但我不確定共識似乎是什麼在易變的明文密碼存儲上。
非常好的一點。經過一番討論後,我們意識到WCF自定義用戶名認證是以明文方式交付密碼的,所以在任何時候,內存中都有純文本密碼(在認證和這些變量被GC分配之間)。所以擁有它們的緩存(尤其是過期的緩存)並不會增加我們的風險。感謝這些優點,我在討論中提出了這些觀點,並幫助我們得出結論:在我們的環境中這是可以接受的。 – 2010-03-30 20:16:03