Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > использование securestring


Автор: nmn 5.3.2009, 21:22
а каким образом можно загрузить значение в SecureString минуя использование string?

Автор: Мурлыкатам_ 31.3.2009, 15:52
А каким образом можно загрузить значение в SecureString используя string?  smile 

Автор: Rififi 31.3.2009, 16:26
nmn, 
любым из доступных методов инициализации

Автор: Мурлыкатам_ 31.3.2009, 16:46
Доступные методы инициализации:
1) с использованием указателя на массив чаров в unsafe контексте
public SecureString(char* value, int length)
    Member of System.Security.SecureString

Summary:
Initializes a new instance of the System.Security.SecureString class from a subarray of System.Char objects.

Parameters:
value: A pointer to an array of System.Char objects.
length: The number of elements of value to include in the new instance.
2) или без параметров  smile 
public SecureString()
    Member of System.Security.SecureString

Summary:
Initializes a new instance of the System.Security.SecureString class.

Rififi, Или есть еще какие-то методы инициализации?

Со строкой я догадался только так делать:

Код

public class SuperSecure
        {
            SecureString secStr = new SecureString();
            public SuperSecure()
            {
                string str = "secure";
                foreach (char c in str)
                {
                    secStr.AppendChar(c);
                }
            }
}


Как я понимаю, без использования массива чаров или указателя на него, или передачи по одному чару, инициализировать SecureString не получиться.


Цитата(nmn @  5.3.2009,  21:22 Найти цитируемый пост)
а каким образом можно загрузить значение в SecureString минуя использование string? 


Выходит есть минимум два варианта:
1) использовать массив чаров и в цикле, используя метод AppendChar загонять массив в SecureString
2) в unsafe контексте создать массив чаров, получить указатель на него, размер массива и создать экзмепляр SecureString с этими параметрами

Или как-то можно еще?

Автор: Rififi 31.3.2009, 16:51
Мурлыкатам_, 
Или есть еще какие-то методы инициализации?
Это был ответ nmn, 
он спрашивал, как загрузить значение в SecureString без использования string
ни один из способов инициализации/заполнения SecureString'а не использует класс string, поэтому можно выбирать любой

Автор: Мурлыкатам_ 31.3.2009, 17:11
Аааа... я так не играю  smile 

я просто читал по диагонали и не заметил слово "доступным"  smile 

Автор: nmn 31.3.2009, 19:49
ну например, пароль вводится в консоли, там придется использовать string

Автор: Мурлыкатам_ 1.4.2009, 13:00
Но можно использовать и Console.ReadKey:

Код

ConsoleKeyInfo c = new ConsoleKeyInfo();
            char[] password = new char[15];
            Console.Write("Please enter password: ");
            int charIndex = 0;
            while (!c.KeyChar.Equals('\r'))
            {
                c = Console.ReadKey();
                if(charIndex > password.Length)
                {
                    // Handle situation
                    return;
                }
                password[charIndex] = c.KeyChar;
                charIndex++;
            }
            // foreach по массиву чаров, и AppendChar в SecureString != '\0'


И опять няма стринга smile

Се равно делать нечего:

Код

        private const short m_PasswordLength = 15;

        private static void GetSecurePassword(ref SecureString securePassword)
        {
            ConsoleKeyInfo keyInfo = new ConsoleKeyInfo();
            char[] password = new char[m_PasswordLength];
            Console.Write("Please enter password: ");
            int charIndex = 0;
            bool passwordLengthCorrect = true;

            while (!keyInfo.KeyChar.Equals('\r')) // пока не нажмут ентер, естественно бэк спэйс нужно юзать аккуратно :) вернее не юзать
            {
                keyInfo = Console.ReadKey();
                if (charIndex >= password.Length)
                {
                    Console.WriteLine("\nSorry, but password you have entered too long.. :-)");
                    passwordLengthCorrect = false;
                    break;
                }

                password[charIndex] = keyInfo.KeyChar;
                charIndex++;
            }

            if (!passwordLengthCorrect)
            {
                // немного рекурсии =)) 
                GetSecurePassword(ref securePassword);
            }
            else  // если сразу пароль нормальный по длине - аппендаем в секурную строку
            {
                foreach (char passwordChar in password)
                {
                    if (passwordChar.Equals('\r'))
                    {
                        break;
                    }

                    securePassword.AppendChar(passwordChar);
                }
            }
        }


Вызов из Main:

Код

SecureString securePassword = new SecureString();

GetSecurePassword(ref securePassword);

Автор: nmn 2.4.2009, 18:36
с консолью убедили, спасибо smile а gui?

Автор: Мурлыкатам_ 3.4.2009, 17:55
c GUI  smile 

Берешь и обрабатываешь KeyDown event (или че-нить в том же духе) smile в том контроле в который пишется, если это текст бокс, так еще и секурным его делаешь, чтобы нельзя было из него копировать ничего и чтобы чары менялись на звездочки =)

Но просто интересно, что же сделал тебе стринг? smile

ЗЫ:

KeyPress нуна обрабатывать smile

Код

 private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
        {
            char c = e.KeyChar;
            // Handle incorrect chars
            // SecureString.AppendChar :))))))
        }


Единственно, что нужно сразу понимать, какие возникнут проблемы если юзеры будут тискать бэк спэйсы и другие "не хорошие" кнопки и соответствующим образом это обработать.

ЗЫЗЫ:

А почему сразу не реализовать сканер сетчатки глаза?   smile 

Автор: nmn 3.4.2009, 19:31
securestring был сделан чтобы пароли не лежали в памяти в открытом виде к тому же у программиста нет прямой возможности удалить пароль так как строки неизменяемы
может в gui есть специальный для этого контрол? ведь есть же в win32 специальное поле ввода для паролей

Автор: PashaPash 3.4.2009, 19:59
nmn, http://weblogs.asp.net/pglavich/archive/2006/02/26/securepasswordtextbox-a-textbox-that-uses-the-securestring-class.aspx

Автор: Мурлыкатам_ 6.4.2009, 17:29
Судя по комментам, контрол не адекватный. В личных целях 'for fun' может и сойдет smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)