Подтвердить что ты не робот

Защищать окна олицетворения?

В моем приложении WPF я хочу разрешить администраторам тестировать соединение с базой данных, используя интегрированную защиту для других пользователей. Поэтому у меня есть форма, которая позволяет администратору вводить домен, имя пользователя и пароль, а затем проверять его. Я могу безопасно обрабатывать пароль до тех пор, пока не назову LogonUser в advapi32.dll, который принимает string password

LogonUser(UserName, Domain, Password, LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT, ref UserHandle)

Я написал функцию утилиты, которая преобразует SecureString в строку как можно более безопасную, а затем im вызывает ее по паролю в вызове LogonUser:

LogonUser(UserName, Domain, Helper.ConvertSafely(Password), LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT, ref UserHandle)

Так как подпись для LogonUser берет строку, если LogonUser не выполняет надлежащий уход за паролем при его выполнении, он все равно может быть в стеке вызовов в виде обычного текста после вызова. Есть ли более безопасный способ олицетворять пользователя, в котором я могу доверять, PW безопасно все время?

В основном все, что мне нужно, это WindowsImpersonationContext, но я бы хотел получить его без пароля, когда-либо находящегося в открытом тексте.

4b9b3361

Ответ 1

Если пользователь, которого вы хотите олицетворять, уже зарегистрирован на компьютере (например, в другом сеансе), вот ответ: Возможно ли, что служба Windows олицетворяет пользователя без пароль?

Если нет, вам нужно будет предоставить пароль LogonUser. И этот пароль должен будет содержать как минимум небольшое количество времени, как есть, в памяти, потому что этот способ определяется LogonUser. Обратите внимание, что не все пакеты auth требуют паролей (например, биометрии или смарт-карты: Обзор проверки подлинности Windows).

Итак, если вы действительно хотите олицетворять себя, где-то вы должны будете передать пароль. В этом случае убедитесь, что вы используете код postlagerkarte из Microsoft для этого: Marshal.SecureStringToGlobalAllocUnicode Пример кода метода

Вы больше не можете делать больше.

Ответ 2

Внутри управляемого приложения вы можете использовать класс SecureString для обработки конфиденциальной информации. Обычно нет необходимости катить свой собственный безопасный строковый механизм.

Как раз перед тем, как вы подключитесь к LogonUser, вы передаете неуправляемую копию пароль SecureString. Для этого используется метод Marshal.SecureStringToGlobalAllocUnicode. Таким образом, в вашем домене приложения никогда не будет управляемый объект, представляющий пароль.

Вы можете найти пример кода в этой статье.

Если вам требуется еще больше безопасности, я бы предложил запретить прямое подключение к базе данных у вас wpf-клиентов. Вы можете ввести средний уровень. Таким образом, безопасность переносится от клиентов к одному серверу. Связь между Client и App-Server зашифровывается, и только сервер приложений ведет переговоры с базой данных.

Ответ 3

Update:

Вы можете реализовать зашифрованный app.config. Вы можете сделать это несколькими различными подходами:

Итак, как это будет работать, когда администратор вставляет учетные данные, которые вы расшифруете app.config, измените ключ/значение на новые учетные данные. Затем, как только он вставлен, он снова зашифровывает файл конфигурации.

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

Это один из подходов, хотя SecureString будет работать, он ожидает char[]. Что в некоторых случаях может быть не идеальным при взаимодействии через advapi32.dll.