Оставление пароля в поле управления паролем 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 ответа
Если вам действительно нужно передать пароль в виде открытого текста, постарайтесь раскрыть его как можно короче.
Следующая ссылка может помочь в этом: Правильно преобразовать безопасную строку в строку
На самом деле есть еще одна тема, единственная самая полезная ссылка для меня была:
Как использовать безопасную строку
Я считаю, что это самое безопасное, что вы можете сделать, если вам действительно нужен открытый текстовый пароль.
Но также проверьте следующие ссылки:
Давай прямо из документации
Когда вы получаете значение свойства Password, вы выставляете пароль в виде простого текста в памяти. Чтобы избежать этой потенциальной угрозы безопасности, используйте свойство SecurePassword, чтобы получить пароль в качестве SecureString.