Как преобразовать строку в securestring явно - PullRequest
49 голосов
/ 27 марта 2012

Я хочу, чтобы текст, введенный в текстовое поле, был преобразован в защищенную строку в c #.

Ответы [ 7 ]

84 голосов
/ 27 марта 2012

Самый простой подход - перебирать исходную строку и добавлять по одному символу за раз к защищенной строке, например:

var secure = new SecureString();
foreach (char c in textbox1.Text)
{
    secure.AppendChar(c);
}
31 голосов
/ 10 июля 2013

Изобретите один раз и повторно используйте лоты.Создайте простой метод расширения для расширения строкового базового класса и сохраните его где-нибудь в классе статических утилит

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;
    }
}

, а затем вызовите его следующим образом:

textbox1.Text.ToSecureString();
18 голосов
/ 18 июля 2015

Вы должны сделать 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;
    }
}
2 голосов
/ 28 сентября 2015

Может быть немного поздно, но вы можете конвертировать SecureString в String таким образом либо

using System.Security;
.
.
.
/// <summary>
/// Converts String to SecureString
/// </summary>
/// <param name="input">Input in String</param>
/// <returns>Input in SecureString</returns>
public SecureString String2SecureString(String input) {
    SecureString _output = new SecureString();
    input.ToCharArray().ToList().ForEach((q) => _output.AppendChar(q));
    return _output;
}

, хотя это все равно, что ответ Балаза Тихани:

Google - это вашдруг ...

var secure = new SecureString(); 
foreach(char c in textbox1.Text) 
{
secure.AppendChar(c); 
}
1 голос
/ 11 октября 2018

Почти то же самое, но короче:

SecureString secureString = new SecureString();
textbox1.Text.ToCharArray().ForEach(c => secureString.AppendChar(c));
0 голосов
/ 21 апреля 2017

Я опасаюсь, что никто не упоминал о том, что конструктор SecureString принимает указатель на массив символов.

public static SecureString ToSecureString(this string source)
{
    char[] charArray = source.ToCharArray();
    unsafe
    {
        fixed (char* chars = charArray)
        {
            return new SecureString(chars, charArray.Length);
        }
    }
}

Обратите внимание, что этот код работает только с опцией компилятора /unsafe.Чтобы установить этот параметр, перейдите в свойства проекта, перейдите на вкладку «Сборка» и установите флажок «Разрешить небезопасный код».

0 голосов
/ 19 июня 2014

используйте это для обработчика событий в вашем текстовом поле:

private void textbox1_TextChanged(object sender, EventArgs e)
    {
    SecureString newSecureTextBox = new SecureString();
        foreach (char c in textbox1.Text.ToCharArray())
        {
        newSecureTextBox.AppendChar(c);
        }
    }

обычно вызывайте вашу переменную как newSecureTextBox

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...