SSL + имя пользователя в запросе (необязательно; но если в конечном итоге у вас будет несколько клиентов, которые вы должны различать, это, вероятно, необходимо) + ПОДПИСАТЬ запрос с паролем, который соответствует этому имени пользователя и известен с обеих сторон.
Обратите внимание, что «подписание» не означает отправку пароля по сети.Это означает хеширование части или полного запроса, а затем включение этого значения в текстовый запрос.Получатель (PHP) будет делать то же самое, затем сравнивать хэши.Подписание гарантирует, что только клиент, который знает пароль, может сделать запрос;недействительные запросы должны быть отклонены.
Шифрование с помощью SSL-сертификата (если оно у вас есть на php-стороне) помогает только скрыть данные от любопытных глаз.Подписание - это то, что проверяет клиента.
Создайте обработчик anon php (сделайте исключение в ваших правилах аутентификации), и это должно работать.
РЕДАКТИРОВАТЬ: ПРИМЕР
Допустим, вы хотите, чтобы ваше приложение C # передавало в приложение PHP следующие данные:
<data>hello</data>
Допустим, вы решили, что этот клиент будет распознан по имени пользователя "uid"
и паролю "pwd"
.
Данные подписи относятся к хэшированию it.Хеширование означает шифрование его таким образом, чтобы его невозможно было расшифровать (ну, вроде; я упростил это; посмотрите это).Существует несколько алгоритмов хеширования, и вам придется найти библиотеку для этого, как для C #, так и для PHP.Наиболее популярными (я думаю) являются "sha1" и "md5".Я даже не знаю основной разницы, и мне все равно.Все, что я знаю, это то, что разные значения «переводятся» в довольно уникальные хеш-значения.Например - хотя, не по теме, обычно принято хранить значения хэшей паролей в базе данных и сравнивать хэши, а не сравнивать текстовые пароли во время проверки пользователя.
В .NET вы можетезначения хэш-строки sha1 / md5 по методу System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile
.Я очень мало знаю о PHP, но я уверен, что вы найдете библиотеку, которая делает то же самое.
Итак, с учетом приведенных выше примеров и учетных данных, вы можете сделать следующее:
1 - Найдите место для имени пользователя (чтобы вы знали, кто отправляет запрос; опять же, если вы ожидаете иметь несколько клиентов; в противном случае, в вашем случае, вы можете пропустить это).Например:
<data username="uid">hello</data>
Вместо этого вы можете делать разные вещи: определять свой собственный формат (xml, json, с разделителями, двоичные данные), или если данные короткие, и вы используете HTTP GET,затем закодируйте его и укажите данные и имя пользователя в виде двух разных пар запросов или HTTP-POST в качестве аргументов для отправки.
2 - Приведенные выше данные по-прежнему являются открытым текстом.Теперь подписание.Это можно сделать несколькими способами, но я сделаю это просто: добавьте открытый пароль к этим данным (не имеет значения, где, пока это местоположение известно обеим сторонам);например,
<data username="uid">hello</data>pwd
Обратите внимание, что мне даже все равно, что я просто сломал xml-формат.Вы могли бы разместить его как атрибут / элемент - где угодно.Это все еще открытый текст.
3 - Хэш.Опять же, не имеет значения, какой алгоритм хеширования вы используете, поскольку он известен обеим сторонам.В этом примере я буду использовать один из множества онлайн-генераторов хешей: http://www.joeswebtools.com/security/sha1-hash-generator/
Когда я вставлю на этот сайт полный текст (включая пароль) из # 2, яполучите это (продолжайте, и вы тоже попробуете):
3311d4ed24ce60f7bf9cf261e3203616b239d944
Таким образом, при одинаковом вводе текста (с учетом регистра, с учетом кодирования) хеширование всегда будет давать точно такой же результат.SHA1 / MD5 - это алгоритмы фиксированной длины (я полагаю, 36 и 40 символов; мне лень проверять это прямо сейчас).
4 - Теперь добавьте это хэшированное значение к исходным данным запроса из # 1(любое место, если оно известно обеим сторонам);например:
<data username="uid">hello</data>3311d4ed24ce60f7bf9cf261e3203616b239d944
или
<data username="uid" signature="3311d4ed24ce60f7bf9cf261e3203616b239d944">hello</data>
Важно то, что PHP должен знать, где найти значение хеша и как его проанализировать.
5 - Отправьте текст из # 4 из C # в PHP.То, что мы сделали до сих пор, было только подписью, чтобы быть уверенным, что отправитель - это тот, о ком вы думаете.Это не шифрование: есть способы перехватить этот запрос и прочитать его (однако никто не может расшифровать пароль).Вам решать, хотите ли вы также зашифровать его (вас волнует, может ли кто-нибудь это прочитать?).Существует также множество способов шифрования данных, но использование SSL-сертификата на стороне PHP (а затем отправка запроса по HTTPS), вероятно, является самым простым, дешевым, наименее подверженным ошибкам / рискованным методом, и - осмелюсь сказать -Лучший.Если вы решите не шифровать, C # отправляет данные так, как это указано в # 4.
6 - PHP получает данные.Если вы использовали SSL, я почти уверен, что вам ничего не придется делать для его расшифровки (это будет делать PHP для вас) - так что в любом случае ваш PHP-скрипт получит данные в виде открытого текста.
<data username="uid" signature="3311d4ed24ce60f7bf9cf261e3203616b239d944">hello</data>
7 - PHP знает об этом формате.Если по какой-либо причине анализ не выполняется, проигнорируйте запрос.Я сказал это, предполагая, что код, выполняющийся на обоих концах, не имеет ошибок, связанных с созданием и чтением запроса.
8 - PHP удаляет подпись из данных запроса (сохраняя ее в памяти), что приводит кthis:
<data username="uid">hello</data>
9 - PHP читает имя пользователя из запроса ("uid").Затем он ищет пароль, связанный с ним ("pwd").Затем он выполняет те же действия, что и клиент C # на шагах № 2 и № 3, и производит для себя следующее:
3311d4ed24ce60f7bf9cf261e3203616b239d944
10 - Форма подписи № 9 ДОЛЖНА быть такой же, какподпись в запросе (от # 8) - с учетом регистра!Если это не так, кто-то пытается притвориться, что он - клиент uid.
11 - Теперь, когда PHP уверен, что клиент является его дружественным приложением C # (давайте назовем это «доверием»), он может обработатьrequest.
Могут быть более элегантные способы, возможно, более простые.Кроме того, когда на шаге 2 я сказал вам добавить пароль, вы могли бы вместо этого добавить HASH пароля (при условии, что ваш PHP даже не имеет открытого текста пароля, но вместо этого он имеет тот же HASH).
Нет, этот метод не может быть подделан.Для меня невозможно - не зная пароля - отправить вам какой-то злонамеренно сформированный запрос, притворяющийся вашим клиентом C #.Однако воспроизведение возможно.Воспроизведение означает: перехват запроса, чтение и повторная отправка.В основном это делается для кражи информации без ведома обеих сторон.Существуют также способы предотвращения воспроизведения, но это выходит за рамки, и вы ничего не делаете для военных, не так ли?
Теперь я хочу получить A за всю эту информацию и мое время:)