2013-12-13 151 views
1

我正在接收用戶名和密碼,通過該用戶名和密碼創建到Web服務的連接,然後使用該服務使用各種功能。將加密密碼保存在內存中以備後用嗎?

但是我正在考慮將用戶名存儲爲明文和加密的密碼,以便以後自動診斷,我可以調用catch()中的方法,該方法將使用相同的用戶名和解密的密碼重新初始化連接。

我沒有太多的加密和解密經驗,但我可以使用建議here的方法,使他們private

另外,當然,我會清空臨時變量,我在那裏存儲密碼,甚至是TextBox文本。

但我想知道在內存中保存加密密碼是否安全?

+1

事實並非如此,垃圾回收器會將副本保留在無法觸及的內存中。而且你不能「消除」字符串,它們是不可變的。 SecureString類的原因。 –

+0

改爲使用單向散列 - SHA1/SHA256。 – Kami

+0

我擔心你缺乏背景(甚至比我更多)來正確地做到這一點。一對夫婦指出:「私人」無法阻止黑客(特別是如果他們可以隨意檢查內存),即使它可以隱藏加密例程,這通過默默無聞的安全性,「消除臨時變量」可能不會你希望它做什麼(假設你的意思是'string s = plaintext; ...; s = null;'),並且如果你保持密鑰可用,那麼你只能最小化地阻止攻擊者。請告訴我是否曲解了一些東西。 – delnan

回答

1

你應該真的哈希密碼,而不是加密它。也就是說,你(以及擴展的攻擊者)應該無法「解密」它們給予你的密碼,如果它被散列的話。

將哈希密碼存儲在內存中是合理的。無論如何,它在某個時刻必須記憶。

+0

但是自始至終都會記住它,有沒有其他的標準方法? – Mahesha999

+0

通常人們將它存儲在數據庫中,但是您的安全性不應該圍繞內存中存在散列密碼的時間長度 – Oleksi

+0

@Oleksi在程序中戳出是合法的,有時甚至是非常有效的攻擊。唯一的缺點是它需要物理訪問計算機,或運行任意代碼(在正確的時間並具有足夠的權限來避開內存保護)。最小化時間關鍵數據在物理內存中使攻擊窗口最小化,儘管它顯然沒有關閉它。 – delnan

1

只是爲了確保我理解正確的話你的問題:

  1. 你正在編寫一個客戶端軟件
  2. 用戶輸入密碼
  3. 您存儲在一個變量的密碼很短的時間來驗證到網絡服務
  4. 您想知道您是否可以將密碼存儲在內存(即在變量中)較長的時間段,以便稍後再次向Web服務進行身份驗證

如果這些假設是正確的:不要太擔心它,只是把它保存在一個變量中,就是這樣 - 最好在Hans Passant建議的SecureString。 SecureString的會做的工作適合你:

一個SecureString的對象的值會自動加密,可以被修改,直到您的應用程序將其標記爲只讀,並且可以從計算機內存或者您的應用程序或刪除.NET Framework垃圾收集器。

哈希在密碼(或散列)存儲在磁盤/數據庫中的服務器端是有意義的。在客戶端,由於您需要對Web服務進行身份驗證,因此無法散列密碼。

如果你想永久存儲密碼(即寫入文件),然後你需要擔心加密/散列。