使用SecureString
这可以简化为一个class轮吗? 只要secureString得到正确的初始化,随意彻底重写它。
SecureString secureString = new SecureString (); foreach (char c in "fizzbuzz".ToCharArray()) { secureString.AppendChar (c); } 
	
你可以使用Linq:
 "fizzbuzz".ToCharArray ().ToList ().ForEach ( p => secureString.AppendChar ( p ) ); 
只需使用NetworkCredential。 它具有内置的转换逻辑。
 SecureString ss = new NetworkCredential("", "fizzbuzz").SecurePassword; 
正如其他人已经指出的,所有这些技术剥夺了SecureString的安全优势,但在某些情况下(如unit testing),这可能是可以接受的。
更新:
如注释中所述,NetworkCredential也可用于将SecureString转换回string。
 string s = new NetworkCredential("", ss).Password; 
 除了使用不安全的代码和char* ,没有更好的方法。 
 这里的重点不是将SecureString内容复制到/从正常string。 不断的"fizzbuzz"是这里的安全漏洞。 
Sascha的答案略有改进,用方法组代替lambda
 "fizzbuzz".ToCharArray().ToList().ForEach(ss.AppendChar); 
 var s = "fizzbuzz".Aggregate(new SecureString(), (ss, c) => { ss.AppendChar(c); return ss; }); 
这是一个如何从.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将是一个参数。 
如果你使用这个来帮助减轻资源; 你会想要小心的范围。 但这可能是一个有益的select,取决于使用情况。
更新:
你实际上可以做一个完整的方法签名:
 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); } } 
下面的文章也会给你一些额外的信息。