Оставление пароля в поле управления паролем WPF

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

Редактировать: Возможно, это сделает обсуждение, предложения и ответы несколько более четкими: учитывая, что у меня есть ситуация, когда у меня нет выбора, кроме как передать простой текстовый пароль элементу ввода на веб-странице html, что является наиболее безопасный способ, которым я могу обработать этот пароль также, учитывая, что я использую поле пароля wpf, чтобы получить его от пользователя, я использую .SecurePassword извлечь пароль из поля пароля и с помощью функции, подробно описанной ниже, передать эту защищенную строку элементу ввода, а затем немедленно отправить форму на сервер.

Я написал небольшое приложение WPF, которое автоматизирует процесс для нашего офиса. В рамках этого приложения идентификатор пользователя и пароль передаются стороннему поставщику. Это приложение остается открытым на рабочем столе пользователя, поэтому этот процесс может выполняться несколько раз в течение дня.

Как я уже писал в приложении, пароль вводится пользователем в поле пароля wpf один раз, а свойство пароля доступно только тогда, когда это требуется сайту поставщика. Я ни в коем случае не передаю пароль другому свойству или текстовой строковой переменной.

Мой вопрос касается безопасности этого подхода. Я не эксперт по информационной безопасности, и мы, честно говоря, не ожидаем, что у нас возникнут какие-либо проблемы из-за его внутренней реализации, но я действительно хотел посмотреть, как поле пароля хранит этот пароль.

Насколько я понимаю, в этом сценарии пароль хранится в памяти в виде простого текста только в тот момент, когда он передается из нашего приложения в приложение стороннего поставщика, что является более или менее неизбежным риском. Внешний поставщик не предоставил нам API, поэтому лучшее, что мы можем сделать, - это сайт поставщика. input element.value = passwordbox.password

Может ли кто-то выделить потенциальные риски такого подхода, может быть, альтернативный метод, если таковой существует, или аргументы в пользу его безопасности, если таковые существуют.

Опять же, это небольшое приложение для внутреннего использования одним отделом. Мы не ожидаем проблем, но мы собираемся задать несколько вопросов по этому поводу. Я просмотрел документацию Microsoft, но хотел узнать, может ли кто-то с большим опытом что-то добавить.

Заранее спасибо за вашу помощь!

РЕДАКТИРОВАТЬ: все еще работает над этим, но я получил несколько хороших отзывов, которые я принял во внимание. Я адаптировал подход со страницы, которую опубликовала Маре Инфинитус, http://blogs.msdn.com/b/fpintos/archive/2009/06/12/how-to-properly-convert-securestring-to-string.aspx

Вот что у меня сейчас:

Пользователь вводит свой пароль в поле пароля WPF. У меня есть следующая функция:

Private Function ConvertToUnsecureString(ByVal SecurePassword As SecureString) As String

    If SecurePassword Is Nothing Then Throw New ArgumentNullException("SecurePassword")

    Dim unmanagedString As IntPtr = IntPtr.Zero
    Try
        unmanagedString = Marshal.SecureStringToGlobalAllocUnicode(SecurePassword)
        Return Marshal.PtrToStringUni(unmanagedString)
    Catch ex As Exception
    Finally
        Marshal.ZeroFreeGlobalAllocUnicode(unmanagedString)
    End Try

End Function

Используя эту функцию, я передаю пароль элементу ввода следующим образом:

InputEl.value = ConvertToUnsecureString(Me.PasswordBox.SecurePassword)

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

2 ответа

Если вам действительно нужно передать пароль в виде открытого текста, постарайтесь раскрыть его как можно короче.

Следующая ссылка может помочь в этом: Правильно преобразовать безопасную строку в строку

На самом деле есть еще одна тема, единственная самая полезная ссылка для меня была:

Как использовать безопасную строку

Я считаю, что это самое безопасное, что вы можете сделать, если вам действительно нужен открытый текстовый пароль.

Но также проверьте следующие ссылки:

ProtectedData API, CryptprotectData

Codeproject статья о шифровании

Давай прямо из документации

PasswordBox.Password Свойство

Когда вы получаете значение свойства Password, вы выставляете пароль в виде простого текста в памяти. Чтобы избежать этой потенциальной угрозы безопасности, используйте свойство SecurePassword, чтобы получить пароль в качестве SecureString.

PasswordBox.SecurePassword Свойство

Другие вопросы по тегам