2015-03-13 3 views
1

При использовании класса ChannelFactory или сгенерированного прокси для доступа к службе WCF можно ли защитить клиентский пароль на клиентской машине?Защита клиентского пароля на клиентской машине

Примечание: Я не говорю о том, чтобы защитить пароль, когда он идет по проводу. Скорее я спрашиваю, можно ли защитить пароль на машине клиента, чтобы кто-то не мог использовать инструмент для раскрытия пароля во время входа пользователя в систему через клиентское приложение.

Я считаю, что это невозможная цель. Независимо от того, как я получаю и защищаю пароль от пользователя - пароль будет отображаться при установке ClientCredentials на ChannelFactory или прокси-объекте.

Например при установке ClientCredentials на ChannelFactory объекта:

var myChannelFactory = new ChannelFactory<IMyService>(myBinding, myEndpoint); 
myChannelFactory.Credentials.UserName.UserName = GetUserName(); 
// Password will be set on channel factory as a string 
myChannelFactory.Credentials.UserName.Password = GetPassword(); 

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

Действительно ли это факт жизни при использовании аутентификации Username/Password для доступа к сервису?

+0

По моему опыту, если клиент физически скомпрометирован, все ставки все равно. –

+0

Да, я согласен, что это далеко не идеальная ситуация. Я вижу, что корень проблемы заключается в том, что учетные данные клиента должны быть переданы каким-то образом, что служба знает, как интерпретировать прогнозируемо. Знание этого общего секрета должно быть где-то в клиенте. –

+0

Возможно, вы сможете использовать собственный модуль аутентификации в сочетании с сервисом, который использует имя пользователя и пароль и возвращает ключ API (эта служба не будет защищена, кроме как с помощью SSL), затем введите ключ API в имя пользователя и оставьте пустым паролем и подтвердите его в отношении списка разрешенных ключей. Убедитесь, что вы удалили исходные учетные данные. Если ключ API закодирован с некоторыми локальными идентификационными данными машины, то по крайней мере вы можете ограничить использование ключа API до тех пор, пока оно действительно. –

ответ

0

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

Я также сделал это, чтобы сохранить хэш, но когда я его использовал, я бы объединил его с DateTime.UtcNow.ToString («DDHH») (день + час) и снова hash. Если он не совпал со стороной WCF, я бы перепрофилировал, используя час до и после часа. see here for hashing.

Смежные вопросы