2012-06-15 116 views
9

此應用程序顯示帶有文本框的表單,用戶應輸入用於解密文檔的密碼。,處理敏感數據(如密碼)的正確方法是什麼?

我的代碼看起來像這樣:

string password = passwordTextBox.Text; 
... 
DecryptDocument(password); 

但有人告訴我,從技術上來說,這是一個安全漏洞,因爲這代表密碼的數據可能會保留在內存中即使該應用程序關閉。

我試圖用爲System.Security.SecureString類,但現在我負責的指針CoTaskMem這似乎使問題變得更糟:

SecureString password = new SecureString(); 
foreach(char i in passwordTextBox.Text.ToCharArray()) 
password.AppendChar(i); 

IntPtr ptr = Marshal.SecureStringToCoTaskMemAnsi(password); 
int length = password.Length; 
byte[] bytes = new byte[length]; 

Marshal.Copy(ptr, bytes, 0, length); 

DecryptDocument(Encoding.Default.GetString(bytes)); 

Marshal.FreeCoTaskMem(ptr); 

正如你所看到的,它看起來並不就像我讓應用程序更安全一樣,因爲遲早我將不得不接受輸入(passwordTextBox.Text)並將其轉換爲可傳遞給DecryptDocument()函數的字符串。

有沒有辦法解決這個問題,還是應該處理這個安全漏洞?

+0

「但從技術上講,這是一個安全漏洞,因爲即使在應用程序關閉後,表示密碼的數據仍可能保留在內存中。」** - 雖然這是事實,但它會在記憶中處於隨機位置。你有什麼擔心**「有沒有辦法解決這個問題,或者我應該只是處理這個安全漏洞?」**這會是什麼樣的漏洞?** –

+2

這將是這個漏洞:http:// cwe .mitre.org/data/definitions/316.html –

+2

@Ramhound,如果你不擔心將文本放在內存中的隨機位置,那麼根本不值得使用SecureString。公平地說,它確實只增加了少量的安全性;主要關心的是崩潰轉儲,雖然那些已經可以泄漏各種敏感信息(即目前爲了工作目的而解密的所有信息)。 SecureString真正爲您購買的唯一東西是泄露密碼的可能性降低,這可能會危及密鑰(或涉及用戶訪問的其他服務,如果他們再次使用密碼短語的話)。 –

回答

7

如果你真的想使用SecureString,它需要被端到端使用,最好是一次只能交互一個角色。無論何時將字符串解密爲字符數組,當您完成使用時,都需要明確地清除內存。對此的後果:

  1. 您應該使用安全的TextBox控件,該控件可以直接與SecureString一起運行。一個很好的例子見here

  2. 您應該修改DecryptDocument以直接獲取SecureString。

  3. 您需要實施解密,以便儘可能少地使用解密字符。 .NET中的一些加密體系結構實際上直接支持SecureString。如果沒有,最好的辦法是使用非託管緩衝區,並在完成後明確清除它。

相關問題