[英]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.