Как реализовать доступ к API из приложения c# .Net?
Есть веб-сервис с API, есть приложение на c#.
Необходимо реализовать аутентификацию (на основе пары логин-пароль).
При отправке формы, пароль должен захешироваться (чтобы не передавать в открытом виде), и вот тут у меня возник вопрос: как?
1. Нужно ли использовать соль, или достаточно просто взять хеш (и почему именно так)?
2. Если используем соль, как ее скрыть от посторонних глаз? Приложение запросто декомпилируется, злоумышленник получает соль и алгоритм.
3. Как избежать атаки man-in-the-middle ? Ведь даже HTTPS не защищает от этой атаки.
Возможно, здесь нужно не просто хеширование, а полноценное шифрование?
Для защиты алгоритма шифрования (хотя, даже если злоумышленник будет знать алгоритм шифрования, это ему мало что даст без закрытого ключа) можно библиотеку с алгоритмом реализовать на компилируемом в бинарный код языке (тот же С++). Но это в том случае, если не найдете готовых решений (коих много в сети).
в чем проблема использовать шифрование? Смотрите в сторона ассиметричных алгоритмов, там шифрование идет одним ключем (который зашит в приложение) а дешифрация идет другим, который известен только веб сервису, даже если ктото сможет перехватить данные он с ними ничего с делать не сможет без ключа, которого нет в приложении и декомпиляция ничем не поможет.
Артем: вы не поняли, шифровать не пароль нужно а все сообщение от клиента к серверу, тогда получив его злоумышленник не сможет его прочесть => не будет знать пороля => не сможет авторизоваться. Прочесть его сможет только тот у кого есть второй ключ от пары, то есть только сервер.
Артем: вообще проблем с этим я не вижу, можно шифровать все что душе угодно, это все равно не отнимает ни времени ни ресурсов особо (если у вас там ни гигабайты по сети летают), к тому же по ссылке которую я скинул есть готовый исходник, в котором функция кушает массив байт и отдает соответственно тоже массив байт, особых заморочек там не будет, нужно просто перед отправкой все "упаковать" и отправить, и соответственно получив "распаковать" и считать
Виталий Пухов: Проблема в том, что если шифровать весь запрос, я в коде API не смогу обратиться к параметрам через $_POST['name']. Как тогда передавать запрос - заносить все в JSON, его шифровать, передавать, на сервере расшифровывать и читать их JSON-объекта параметры? Или лучше зашифровать каждый параметр по отдельности, типа:
name=RSA('Шурик')
login=RSA('mylogin')
pass=RSA('asdasd')
ну это я обобщил немного..
Артем: сервер на чем крутится который API читает\парсит? Если запрос принимает C# то проблем его расшифровать полностью и передать тому кому он нужен не проблема, если же там не C# не факт что вообще получится его расшифровать.
Виталий Пухов: API на php, RSA расшифровывает нормально. Клиент на c# wpf, шифрует тоже нормально.
Меня теперь интересует в каком формате запрос посылать :). Кучу полей с шифрованными значениями или один шифрованный объект, в котором каким то образом находятся все поля..
Артем: думаю удобнее будет расшифровать весь запрос, а потом таскать на сервере уже "чистый" объект, с которым можно работать без заморочек, и имеющийся код почти не придется переделывать я думаю