Как преобразовать строку в securestring явно
Я хочу, чтобы текст, введенный в текстовом поле, был преобразован в защищенную строку в C# Спасибо за ответ заранее.
7 ответов
Самый простой подход заключается в переборе исходной строки и добавлении одного символа за раз к защищенной строке, например, так:
var secure = new SecureString();
foreach (char c in textbox1.Text)
{
secure.AppendChar(c);
}
Изобретите один раз и используйте много раз. Создайте простой метод расширения для расширения базового класса строки и сохраните его где-нибудь в статическом классе утилит
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();
Вы должны сделать 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;
}
}
Я опасаюсь, что никто не упоминал о том, что конструктор SecureString принимает указатель на массив символов.
public static SecureString ToSecureString(this string source)
{
char[] charArray = source.ToCharArray();
unsafe
{
fixed (char* chars = charArray)
{
return new SecureString(chars, charArray.Length);
}
}
}
Обратите внимание, что этот код работает только с /unsafe
опция компилятора. Чтобы установить этот параметр, перейдите в свойства проекта, вкладка "Построить" и установите флажок "Разрешить небезопасный код".
Почти то же самое, но короче
SecureString secureString = new SecureString();
textbox1.Text.ToCharArray().ForEach(c => secureString.AppendChar(c));
Это может быть немного поздно, но вы можете преобразовать 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); }
Используйте это для обработчика событий в вашем текстовом поле:
private void textbox1_TextChanged(object sender, EventArgs e)
{
SecureString newSecureTextBox = new SecureString();
foreach (char c in textbox1.Text.ToCharArray())
{
newSecureTextBox.AppendChar(c);
}
}
вызовите вашу переменную как обычно newSecureTextBox