使用SecureString

Tod*_*ith 47 c# security securestring

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

SecureString secureString = new SecureString ();
foreach (char c in "fizzbuzz".ToCharArray())
{
    secureString.AppendChar (c);
}
Run Code Online (Sandbox Code Playgroud)

Kev*_*vin 47

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

SecureString ss = new NetworkCredential("", "fizzbuzz").SecurePassword;
Run Code Online (Sandbox Code Playgroud)

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

更新:

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

string s = new NetworkCredential("", ss).Password;
Run Code Online (Sandbox Code Playgroud)

  • 并且在.Net 4.0之前不可用 (2认同)
  • 优雅!它甚至可以在两个方向上工作. (2认同)

Sas*_*cha 46

你可以使用Linq:

"fizzbuzz".ToCharArray().ToList().ForEach(p => secureString.AppendChar(p));
Run Code Online (Sandbox Code Playgroud)

  • 您可以使用以下命令避免额外的.ToList()操作:`Array.ForEach("fizzbuzz".ToCharArray(),secureString.AppendChar);` (27认同)

Hen*_*man 28

除了使用不安全的代码和a char*,没有(更好)更好的方法.

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

  • 如果您从击键中收集SecureString,则实际上并没有原始字符串.我相信这是SecureString的初衷. (14认同)

Pet*_*lly 16

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

"fizzbuzz".ToCharArray().ToList().ForEach(ss.AppendChar);
Run Code Online (Sandbox Code Playgroud)


Kev*_*vin 14

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


Bor*_*itz 8

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

SecureString secureString;
fixed (char* chPtr = plainString)
  secureString = new SecureString(chPtr, plainString.Length);
Run Code Online (Sandbox Code Playgroud)

丑陋但可能效率最高.

  • 注意,使用`fixed`需要一个`unsafe`块,这反过来要求编译器切换`/ unsafe`. (8认同)

Gre*_*reg 6

由于SecureString利用了IDispose界面。您实际上可以这样做。

SecureString secure = new SecureString();
foreach(var character in data.ToCharArray())
    secure.AppendChar(character);
Run Code Online (Sandbox Code Playgroud)

本质上,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;

}
Run Code Online (Sandbox Code Playgroud)

对于解密,您需要执行以下操作:

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

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


Ger*_*ius 5

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

Array.ForEach("fizzbuzz".ToCharArray(), secureString.AppendChar);
Run Code Online (Sandbox Code Playgroud)