49

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

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

8 回答 8

59

只需使用 NetworkCredential。它具有内置的转换逻辑。

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

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

更新:

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

string s = new NetworkCredential("", ss).Password;
于 2012-06-22T16:39:40.707 回答
49

你可以使用 Linq:

"fizzbuzz".ToCharArray().ToList().ForEach(p => secureString.AppendChar(p));
于 2010-03-10T20:06:47.343 回答
29

除了使用不安全的代码和 a 之外char*,没有(很多)更好的方法。

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

于 2010-03-10T20:06:18.687 回答
17
var s = "fizzbuzz".Aggregate(new SecureString(), (ss, c) => { ss.AppendChar(c); return ss; });
于 2011-07-18T23:52:04.640 回答
17

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

"fizzbuzz".ToCharArray().ToList().ForEach(ss.AppendChar);
于 2011-08-19T12:55:47.553 回答
9

既然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);
     }
}

以下文章还将为您提供一些其他信息。

于 2014-01-20T01:41:11.620 回答
8

以下是 .NET 的 NetworkCredential 类如何执行此操作:

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

丑陋但可能是最有效的。

于 2013-12-18T00:30:25.597 回答
5

最少的代码,因为.ToList()这不是必需的:

Array.ForEach("fizzbuzz".ToCharArray(), secureString.AppendChar);
于 2018-03-02T06:24:46.857 回答