2009-10-15 54 views

回答

83

你不知道。使用SecureString對象的全部原因是爲了避免創建一個字符串對象(該對象被加載到內存中並以明文形式保存直到垃圾收集)。但是,您可以通過追加字符來將字符添加到SecureString中。

var s = new SecureString(); 
s.AppendChar('d'); 
s.AppendChar('u'); 
s.AppendChar('m'); 
s.AppendChar('b'); 
s.AppendChar('p'); 
s.AppendChar('a'); 
s.AppendChar('s'); 
s.AppendChar('s'); 
s.AppendChar('w'); 
s.AppendChar('d'); 
+18

不要忘記讓它只讀s.MakeReadOnly(); – ysrb 2013-06-18 00:48:08

+3

「組合是'12345'......這是白癡在他的行李上的那種東西!」 – 2017-09-27 23:47:51

+0

我看到的只是'*****' – 2017-11-21 19:48:56

4

我會把它扔到那裏。爲什麼?

你不能只是改變你所有的字符串來保護字符串,突然你的應用程序是「安全的」。安全字符串旨在儘可能長時間保持字符串的加密,並且只在很短的時間內解密,並在對其執行操作後擦除內存。

我會冒險說你可能有一些設計級別的問題需要處理,然後再擔心應用程序字符串的安全問題。向我們提供更多關於您想做什麼的信息,並且我們可能會提供更好的幫助。

+1

我只是想用它來進行的ProcessStartInfo設置密碼和運行我的exe文件爲不同的用戶。 。這對我有效... – Nila 2009-10-15 11:12:52

+2

我的應用程序通過在安全系統上運行來保護。我不關心在內存中加密這個特定的字符串。在這個系統上有更多重要的信息可以擔心它是否會受到影響。我的程序需要使用的Microsoft API只需要SecureString。這意味着開發人員考慮他或她自己的用例,並確定將Strings轉換爲SecureStrings是否是上下文中的有效操作。 – Dan 2017-04-25 15:20:27

3

我同意斯賓塞(+1),但如果你這樣做是爲了學習或測試pourposes,你可以在字符串中使用foreach,追加每字符使用AppendChar方法SecureString的。

39

以下方法有助於將字符串轉換爲安全字符串

private SecureString ConvertToSecureString(string password) 
{ 
    if (password == null) 
     throw new ArgumentNullException("password"); 

    var securePassword = new SecureString(); 

    foreach (char c in password) 
     securePassword.AppendChar(c); 

    securePassword.MakeReadOnly(); 
    return securePassword; 
} 
+11

+1,但請注意,將密碼作爲字符串參數傳遞會在託管內存中創建未加密的字符串實例,並首先破壞了「SecureString」的用途。只是指出未來的人誰來使用這個代碼。 – Cody 2017-01-25 21:47:31

+5

@Cody這是真的,也是一個很好的觀點,但我們很多人並不關心SecureString是否安全,並且僅僅使用它,因爲一些Microsoft API要求它作爲參數。 – Dan 2017-04-25 15:17:17

11

您可以按照:

string password = "test"; 
SecureString sec_pass = new SecureString(); 
Array.ForEach(password.ToArray(), sec_pass.AppendChar); 
sec_pass.MakeReadOnly(); 
6
unsafe 
{ 
    fixed(char* psz = password) 
     return new SecureString(psz, password.Length); 
} 
5

這裏是一個廉價的LINQ詭計。

  SecureString sec = new SecureString(); 
      string pwd = "abc123"; /* Not Secure! */ 
      pwd.ToCharArray().ToList().ForEach(c => sec.AppendChar(c)); 
      /* and now : seal the deal */ 
      sec.MakeReadOnly(); 
+11

這個答案是一個練習,可以看到有多少個臨時副本可以在一次生成中生成純文本 – 2016-05-16 20:43:49

2

如果你想一個string的一個SecureString轉換壓縮成LINQ語句,您可以如下表達出來:

var plain = "The quick brown fox jumps over the lazy dog"; 
var secure = plain 
      .ToCharArray() 
      .Aggregate(new SecureString() 
         , (s, c) => { s.AppendChar(c); return s; } 
         , (s) => { s.MakeReadOnly(); return s; } 
         ); 

但是,請記住,使用LINQ不提高這個解決方案的安全性。它遭受與從stringSecureString的任何轉換相同的缺陷。只要原始的string保留在內存中,數據就很脆弱。

話雖這麼說,有什麼上面的語句可以提供在保持共同創建SecureString的,它與數據初始化終於從修改鎖定它。

3

沒有花哨LINQ,不能用手將所有的字符,只是簡單明瞭:

var str = "foo"; 
var sc = new SecureString(); 
foreach(char c in str) sc.appendChar(c); 
+0

甚至很有用,不需要定義變量 – bigworld12 2016-07-22 12:56:00

+0

這裏是一行代碼: 'var sc = new SecureString(); foreach(「foo」中的char c)sc.appendChar(c);' – bigworld12 2016-07-22 12:56:57

44

也有另一種方式來SecureStringString之間的轉換。

1.字符串到SecureString的

SecureString theSecureString = new NetworkCredential("", "myPass").SecurePassword; 

2。SecureString的爲String

string theString = new NetworkCredential("", theSecureString).Password; 

這裏是link

+1

這是迄今爲止最常用的最佳解決方案! – Dan 2017-04-25 15:31:22

+3

如果你的代碼創建一個帶有你想保護的值的字符串對象,那麼使用'SecureString'沒有意義。 「SecureString」的目標是避免在託管內存中包含字符串,因此檢查該內存的攻擊者可以發現要隱藏的值。由於您正在調用的'NetworkCredential'構造函數需要一個字符串,這不是一種可行的方式......當然,您的代碼是一種轉換SecureString和從SecureString轉換的簡單方法,但使用它可以使您的代碼像使用簡單'string' – 2018-02-04 17:40:41

0

以下2個擴展應該做的伎倆:

  1. 對於char陣列

    public static SecureString ToSecureString(this char[] _self) 
    { 
        SecureString knox = new SecureString(); 
        foreach (char c in _self) 
        { 
         knox.AppendChar(c); 
        } 
        return knox; 
    } 
    
  2. 而對於string

    public static SecureString ToSecureString(this string _self) 
    { 
        SecureString knox = new SecureString(); 
        char[] chars = _self.ToCharArray(); 
        foreach (char c in chars) 
        { 
         knox.AppendChar(c); 
        } 
        return knox; 
    } 
    

感謝John DaggAppendChar建議。

2

你可以使用這個簡單的腳本

private SecureString SecureStringConverter(string pass) 
{ 
    SecureString ret = new SecureString(); 

    foreach (char chr in pass.ToCharArray()) 
     ret.AppendChar(chr); 

    return ret; 
} 
+0

這個答案[15個月前發佈](https://stackoverflow.com/a/38326325/11683)。真的沒有必要再發布它。 – GSerg 2017-10-28 06:57:47

0

一種更簡單的方法,可用於:

# Take password and convert it to a secure string 
$mySS = "MyCurrentPassword" | ConvertTo-SecureString -AsPlainText -Force