使用SecureString

时间:2010-03-10 20:00:46

标签: c# security securestring

这可以简化为一个班轮吗?只要secureString被正确初始化,就可以完全重写它。

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

8 个答案:

答案 0 :(得分:46)

只需使用NetworkCredential。它内置了转换逻辑。

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

正如其他人所说,所有这些技术都剥夺了SecureString的安全优势,但在某些情况下(例如单元测试),这可能是可以接受的。

更新

如评论中所述,NetworkCredential也可用于将SecureString转换回字符串。

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

答案 1 :(得分:44)

你可以使用Linq:

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

答案 2 :(得分:26)

除了使用不安全的代码和char*之外,还没有更好的方法。

这里的要点是不要将SecureString内容复制到普通字符串中。常量"fizzbuzz"常量是此处的安全漏洞。

答案 3 :(得分:16)

Sascha用方法组替换lambda的答案略有改进

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

答案 4 :(得分:14)

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

答案 5 :(得分:8)

这是.NET的NetworkCredential类如何做到的:

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

丑陋但可能效率最高。

答案 6 :(得分:5)

由于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);
     }
}

以下article也会为您提供一些其他信息。

答案 7 :(得分:2)

最少量的代码,因为此不需要.ToList()

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