簡體   English   中英

使用 SecureString

[英]Using SecureString

這可以簡化為一個班輪嗎? 只要 secureString 正確初始化,就可以完全重寫它。

SecureString secureString = new SecureString ();
foreach (char c in "fizzbuzz".ToCharArray())
{
    secureString.AppendChar (c);
}

只需使用 NetworkCredential。 它具有內置的轉換邏輯。

SecureString ss = new NetworkCredential("", "fizzbuzz").SecurePassword;

正如其他人所指出的,所有這些技術都剝奪了 SecureString 的安全優勢,但在某些情況下(例如單元測試),這可能是可以接受的。

更新:

如評論中所述,NetworkCredential 還可用於將 SecureString 轉換回字符串。

string s = new NetworkCredential("", ss).Password;

你可以使用 Linq:

"fizzbuzz".ToCharArray().ToList().ForEach(p => secureString.AppendChar(p));

除了使用不安全代碼和char* ,沒有(更)更好的方法。

這里的重點不是將 SecureString 內容復制到/從普通字符串復制。 恆定的"fizzbuzz"常數是這里的安全漏洞。

var s = "fizzbuzz".Aggregate(new SecureString(), (ss, c) => { ss.AppendChar(c); return ss; });

用方法組替換 lambda 對 Sascha 的回答略有改進

"fizzbuzz".ToCharArray().ToList().ForEach(ss.AppendChar);

以下是 .NET 中的 NetworkCredential 類是如何做到的:

SecureString secureString;
fixed (char* chPtr = plainString)
  secureString = new SecureString(chPtr, plainString.Length);

丑陋但可能是最有效的。

由於SecureString使用IDispose接口。 你實際上可以這樣做。

SecureString secure = new SecureString();
foreach(var character in data.ToCharArray())
    secure.AppendChar(character);

本質上, data將是一個參數。

如果您利用using來幫助減輕資源; 你要小心范圍。 但這可能是一個有益的替代方案,具體取決於使用情況。

更新:

你實際上可以做一個完整的方法簽名:

public static SecureString ConvertStringToSecureString(this string data)
{
     var secure = new SecureString()
     foreach(var character in data.ToCharArray())
         secure.AppendChar(character);

     secure.MakeReadOnly();
     return secure;

}

對於你想要做的解密:

public static string ConvertSecureStringToString(this SecureString data)
{
     var pointer = IntPtr.Zero;
     try
     {
          pointer = Marshal.SecureStringToGlobalAllocUnicode(data);
          return Marshal.PtrToStringUni(pointer);
     }
     finally
     {
          Marshal.ZeroFreeGlobalAllocUnicode(pointer);
     }
}

下面的文章也將為您提供一些額外的信息。

最少的代碼,因為.ToList()不需要:

Array.ForEach("fizzbuzz".ToCharArray(), secureString.AppendChar);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM