如何显式地将字符串转换为securestring

Ind*_*eti 51 c# securestring

我希望在文本框中输入的文本在c#中转换为securestring,感谢您提前回答.

Bal*_*nyi 86

最简单的方法是迭代源字符串并一次将一个字符附加到安全字符串,如下所示:

var secure = new SecureString();
foreach (char c in textbox1.Text)
{
    secure.AppendChar(c);
}
Run Code Online (Sandbox Code Playgroud)

  • 请注意,在转换为SecureString之前将数据保留在纯字符串中会超过使用SecureString的全部要点. (22认同)
  • 我是唯一一个发现单个最常见的`SecureString`用例需要for循环令人困惑的人吗? (9认同)
  • 谷歌在这里领先.关于谷歌的互联网答案是可以想象得到的最循环的东西.如果问题已经在SO上提出,那就是另一回事了(我确信它已经存在). (7认同)

小智 33

发明一次并重复使用批次.创建一个简单的扩展方法来扩展字符串基类并在某处存储一些静态实用程序类

using System.Security;

/// <summary>
/// Returns a Secure string from the source string
/// </summary>
/// <param name="Source"></param>
/// <returns></returns>
public static SecureString ToSecureString(this string source)
{
    if (string.IsNullOrWhiteSpace(source))
        return null;
    else
    {
        SecureString result = new SecureString();
        foreach (char c in source.ToCharArray())
            result.AppendChar(c);
        return result;
    }
}
Run Code Online (Sandbox Code Playgroud)

然后调用如下:

textbox1.Text.ToSecureString();
Run Code Online (Sandbox Code Playgroud)

  • 请注意,在转换为SecureString之前将数据保留在纯字符串中会超过使用SecureString的全部要点. (11认同)

Mov*_*GP0 18

你应该只读取SecureString.所以代码应如下所示:

static class SecureStringExtensions
{
    public static string ToUnsecureString(this SecureString secureString)
    {
        if (secureString == null) throw new ArgumentNullException("secureString");

        var unmanagedString = IntPtr.Zero;
        try
        {
            unmanagedString = Marshal.SecureStringToGlobalAllocUnicode(secureString);
            return Marshal.PtrToStringUni(unmanagedString);
        }
        finally
        {
            Marshal.ZeroFreeGlobalAllocUnicode(unmanagedString);
        }
    }

    public static SecureString ToSecureString(this string unsecureString)
    {
        if (unsecureString == null) throw new ArgumentNullException("unsecureString");

        return unsecureString.Aggregate(new SecureString(), AppendChar, MakeReadOnly);
    }

    private static SecureString MakeReadOnly(SecureString ss)
    {
        ss.MakeReadOnly();
        return ss;
    }

    private static SecureString AppendChar(SecureString ss, char c)
    {
        ss.AppendChar(c);
        return ss;
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 对代码的小调整是在抛出ArgumentNullExceptions时使用'nameof(securestring)'和'nameof(unsecureString)'.在我的实现中,我使用lambda用于AppendChar和MakeReadOnly,但这只是个人风味酱;) (2认同)