2011-12-31 80 views
3

我看到這個線程:SecureString解決方案很好,但有內在的矛盾?

When would I need a SecureString in .NET?

代碼有:

SecureString password = new SecureString("password"); 

VS

SecureString pass = new SecureString(); 
foreach (char c in "password".ToCharArray()) 
    pass.AppendChar(c); 

而且我明白了第二個的利益(加字符由char) - 這樣黑客就不能跟蹤所有隨機存儲在內存中的字符(相對於mem中的一個字符串,他可以使用f IND)。我不understnad

的部分原因是,部分: enter image description here

是黃色的代碼是謙恭的記憶!

so ... 其中是好處嗎?

回答

3

ToCharArray()的第二個代碼示例僅演示了填充固定字符串的限制方式。這不是一個(最佳)實踐的樣本。

您鏈接的線程提供了大部分答案:Securestring提供了避免純文本密碼(在內存中)的部分解決方案。不是完整的解決方案。

但是從接受的答案拿這2點:

  • WPF的PasswordBox控制保持密碼作爲內部一個SecureString的。
  • System.Diagnostics.ProcessInfo的Password屬性是一個SecureString。

他們一起允許您安全地將密碼傳輸到進程。

+0

我認爲「密碼」字符串(for循環)應儘快GC'ed。 GC.collect會在這裏幫助嗎? (在for循環之後) – 2011-12-31 13:44:08

+0

不,''「密碼」'是文字,它不會被收集。 – 2011-12-31 13:49:23

+0

1)爲什麼不收集?沒有人在foreach循環之後再引用他2)如果它不會被收集,那麼黑客可以搜索它並找到它......請澄清:) – 2011-12-31 13:53:26

1

密碼在某些時候將始終未加密。問題是,「多長時間?」如果你在內存中保持半小時未加密,那麼它比被幾秒鐘收集垃圾的字符串更可能被黑客入侵。

+0

我認爲「密碼」字符串(在for循環)應儘快GC'ed。 GC.collect會在這裏幫助嗎? (for循環後) – 2011-12-31 13:12:31

+0

GC.Collect將有所幫助,但不能完全消除該問題。 – 2011-12-31 13:54:57

+0

那麼如果不能消除這個概率,最終的解決方案是什麼? – 2011-12-31 13:59:15