Я хочу, чтобы текст, введенный в текстовое поле, был преобразован в securestring в C #.
Как явно преобразовать строку в securestring
Ответы (7)
Самый простой подход - перебрать исходную строку и добавлять по одному символу к защищенной строке, например:
var secure = new SecureString();
foreach (char c in textbox1.Text)
{
secure.AppendChar(c);
}
SecureString
варианта использования требуется цикл for?
- person Jake; 19.08.2016
SqlCredential
в My.Settings
(Настройки приложения / Файл конфигурации) при шифровании файла настроек. так что есть другой вариант. Никогда не используйте закодированный пароль в любом случае, согласно MS, его можно восстановить с помощью некоторых инструментов после развертывания Примечание по безопасности.
- person wpcoder; 05.08.2017
Придумайте один раз и используйте партии повторно. Создайте простой метод расширения, чтобы расширить базовый класс строки и сохранить его где-нибудь в каком-нибудь статическом классе утилит.
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
, если строка равна нулю или пробелу, чтобы представить нулевой или пустой SecureString
. NullReferenceExceptions
может быть жестоким.
- person ; 25.09.2016
Вы должны сделать 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;
}
}
Marshal.SecureStringToGlobalAllocUnicode
. -- Спасибо!
- person BrainSlugs83; 23.06.2016
Возможно, это немного поздно, но вы можете преобразовать 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); }
.ToCharArray()
, так что просто input.ToList().ForEach(q => _output.AppendChar(q));
- person knguyen; 22.10.2015
input.ToList().ForEach(_output.AppendChar);
- person hypehuman; 26.10.2015
Я уверен, что никто не упомянул о конструкторе SecureString, принимающем указатель на массив char.
public static SecureString ToSecureString(this string source)
{
char[] charArray = source.ToCharArray();
unsafe
{
fixed (char* chars = charArray)
{
return new SecureString(chars, charArray.Length);
}
}
}
Обратите внимание, что этот код работает только с параметром компилятора /unsafe
. Чтобы установить этот параметр, перейдите в свойства проекта, вкладку «Сборка» и установите флажок «Разрешить небезопасный код».
/unsafe
в vs 2017, и каковы преимущества?
- person wpcoder; 07.08.2017
/unsafe
, что и в более ранних версиях VS - щелкните правой кнопкой мыши проект WinForms в Project Explorer
и выберите Properties
или дважды щелкните элемент Properties
в проекте WinForms в Project Explorer
. Затем выберите вкладку Build
и установите флажок Allow unsafe code
. Это позволит вам использовать контекст unsafe { }
, который требуется для использования указателей в управляемом коде.
- person Szybki; 07.08.2017
what is the use?
: если вы обращаетесь к памяти напрямую из кода C # с помощью указателей, вы всегда должны использовать ключевое слово unsafe
, а ключевое слово fixed
указывает, что его не следует перемещать в памяти. Все это используется, потому что конструктор SecureString
ожидает char* (char pointer)
- person Jordy van Eijk; 12.06.2018
Примерно то же самое, но короче:
SecureString secureString = new SecureString();
textbox1.Text.ToCharArray().ForEach(c => secureString.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
LostFocus
, а не TextChanged
. Каждый раз, когда нажимается клавиша, срабатывает событие TextChanged, поэтому оно перестраивается каждый раз, как если бы они пытались ввести нажатие клавиши. А почему .ToCharArray()
? Вы можете легко получить символы из .Text
.
- person vapcguy; 25.01.2017
var output = new SecureString(); input.ToList().ForEach(output.AppendChar);
. - person BrainSlugs83   schedule 23.06.2016