Я работаю над службой REST, у которой есть несколько требований:
Мое текущее предлагаемое решение состоит в том, чтобы иметь настраиваемый заголовок авторизации, который выглядит следующим образом (так же, как работают веб-службы Amazon):
Authorization: MYAPI username:signature
У меня вопрос, как оформить подпись. Когда пользователь входит в службу, ему выдается секретный ключ, который он может использовать для подписи запросов. Это остановит отправку запросов другими пользователями от их имени, но не помешает им подделывать запросы.
Приложение, которое будет использовать эту службу, является приложением для iPhone, поэтому я подумал, что мы могли бы иметь открытый ключ, встроенный в приложение, с которым мы можем сделать дополнительную подпись, но означает ли это, что нам нужно будет иметь две подписи, одну для пользовательского ключа и один для ключа приложения?
Любой совет будет очень признателен, я бы очень хотел сделать это правильно с первого раза.





Я думаю, что самый простой способ сделать это правильно - использовать аутентификацию клиента HTTPS. На сайте Apple есть нить именно по этой теме.
Обновлено: для обработки авторизации я бы создал отдельный ресурс (URI) на сервере для каждого пользователя и разрешил бы только этому (аутентифицированному) пользователю управлять этим ресурсом.
Edit (2014): Apple изменила программное обеспечение для форумов за последние шесть лет; поток сейчас находится на https://discussions.apple.com/thread/1643618
Как это мешает пользователям подделывать запросы?
Для аутентификации клиента HTTPS требуется, чтобы у клиента был действующий сертификат открытого ключа. Если вы не имеете в виду под «подделкой запросов», что аутентифицированный пользователь каким-то образом делает неавторизованные запросы, что является проблемой авторизации, а не проблемой аутентификации.
Это проблема, которую я пытаюсь решить, я обновил тему, чтобы отразить это. Как вы посоветуете разрешать действительные запросы?
@PeterMorris Вы собираетесь на -1 из-за неработающей ссылки в ответе шестилетней давности? Хороший.
@StevenHuwig Да. Цель состоит в том, чтобы привлечь плакат (вас) обратно, чтобы вы могли исправить свой ответ, а затем, когда вы комментируете, говоря «Спасибо, я исправил», я удаляю -1. Это практика контроля качества, не более того :)
Кажется более конструктивным потратить тридцать секунд, которые я потратил на то, чтобы отследить исходную ссылку и опубликовать ее в комментарии или редактировании.
Стивен, пожалуйста, поймите, что я всего лишь пытаюсь быть полезным. Тот факт, что этот ответ был опубликован 6 лет назад, не имеет значения. Так это факт, что у вас была такая же проблема 2 года назад и вы ее исправили. Проблема в том, что сегодня он сломан. Возможно, вы могли бы процитировать соответствующие части из ссылки на будущие ответы? Таким образом, неработающая ссылка даже не будет актуальной (я видел, как предлагался такой подход). А пока то, что вы делаете с этим, - ваш выбор, я только хотел сообщить вам.
Стивен, если вы хотите написать мне по электронной почте, чтобы обсудить это (mrpmorris в gmail), вы можете связаться со мной по Skype (mrpmorris) - мои действия не являются злонамеренными.
@PeterMorris Нечего обсуждать; вы игнорируете четко сформулированную цель отрицательных голосов, и, конечно же, я ничего не могу сделать, чтобы остановить это. Ваши намерения не имеют значения. stackoverflow.com/help/privileges/vote-down - «Используйте отрицательные голоса всякий раз, когда вы сталкиваетесь с вопиюще небрежным постом, не требующим усилий, или с ответом, который является явно и, возможно, опасно неверным».
И каковы ваши намерения при просмотре моих ответов и их отрицательном голосовании? Соответствуют ли они опубликованной вами ссылке?
Они соответствуют вашему подходу к этому делу, поэтому, если вам не нравится такой подход, я предлагаю вам изменить его.
Что не так с Дайджест-аутентификация HTTP?
Во-первых, мне придется использовать SSL для запросов (что нормально), но это не мешает пользователю войти в API с устройства, отличного от iPhone, и отправить поддельные запросы.
Как они могут подделать запрос с помощью дайджест-аутентификации? Как они получили текущее значение одноразового номера и создали приемлемый дайджест-ответ?
Они могут подделать запрос, потому что они могут создать стороннее клиентское приложение, которое входит в API, после чего они могут отправлять свои собственные запросы. Мне нужно проверить источник запроса api.
Почему вы не можете использовать одноразовый номер клиента в ответе, который представляет собой строку подписи, уникальную для каждого iPhone?
Когда пользователь входит в систему, мы получаем его идентификатор устройства, так что это может сработать. Я исследую это и посмотрю, что у меня получится.
Если вы можете прочитать идентификатор устройства, то и злоумышленник сможет. Это не полная защита. Однако это затрудняет атаку, что может быть достаточно хорошо. Совместите это с обширным ведением журнала, и вы сможете определить мошенничество и удалить все записи (и заблокировать?) Этого пользователя.
Это лучше обсудить здесь:
Ответ прост: это невозможно. Как только вы отправляете какое-либо решение конечному пользователю, он всегда может атаковать сервер, с которым общается. Самая распространенная разновидность этой проблемы - накрутка списков рекордов во флеш-играх. Вы можете сделать это Сильнее, встроив какое-то шифрование в клиент и запутав код ... Но весь скомпилированный и запутанный код всегда можно декомпилировать и разблокировать. Это просто вопрос того, сколько времени и денег вы готовы потратить, а также на потенциального злоумышленника.
Итак, вас беспокоит нет, как предотвратить отправку пользователем ошибочных данных в вашу систему. Это как запретить пользователю разрушительный вашей системы. Вы должны спроектировать свои интерфейсы так, чтобы весь ущерб, нанесенный ошибочными данными, затрагивал только отправляющего их пользователя.
В этом случае мы собираемся выполнить развертывание на iphone, поэтому есть риск, что кто-то декомпилирует код. Вы поднимаете очень веские вопросы в своем сообщении об ограничении возможности повредить только данные пользователей, в этом случае они смогут обмануть в игре, поэтому нам нужно иметь возможность выявлять читеров и эффективно бороться с ними. Задача непростая.
Единственный способ защитить av-игру - запустить ее полностью на сервере и отправлять действия пользователя только по сети. Обычно я делаю следующее: 1. Усложняю жульничество 2. Сохраняю как можно больше информации. Обман обычно довольно легко обнаружить, поэтому вы можете впоследствии удалить все записи для этого пользователя.
Если вы разрабатываете ИГРУ, и это проблема ОБМАНА, то у вас есть целый ряд других инструментов, доступных вам - в зависимости от того, будет ли это игра на ловкость или азартная игра. Вообще говоря, производительность игроков можно измерить статистически и выявить странные закономерности - именно столько систем обнаружения мошенничества работает в индустрии развлечений. Еще одна вещь, которая сразу приходит в голову, - это алгоритмический дизайн, который привносит в игру определенные измеримые свойства - например, накопление ошибок в числах с плавающей запятой.
Определите «запросы на подделку». Какая сущность создает неподдельные запросы? Это клиентское ПО?