У меня есть сервер (приложение RoR), отправляющий информацию клиенту (приложение Ruby Sinatra), и мне нужен способ, чтобы клиент мог убедиться, что данные поступили с моего сервера, а не от злой третьей стороны.
Клиент должен войти на сервер, прежде чем что-либо будет отправлено обратно, чтобы сервер мог ответить на вход с помощью общего ключа, используемого для подписи всех дальнейших ответов, но тогда третья сторона может перехватить этот ответ и быть злым.
Я хотел бы найти какой-нибудь способ (в Ruby, с целью кросс-платформенной применимости) подписать ответ сервера, чтобы его можно было проверить без проверки кода клиента, ведущего к подделкам. Любые идеи?
ОБНОВЛЕНИЕ: посмотрим, смогу ли я объяснить это лучше!
(Я добавил код в github с тех пор, как написал этот вопрос, так что вы можете (если хотите!) покопаться: Клиент Сервер)
Процесс таков: Джо Блоггс использует букмарклет на своем мобильном устройстве. Это отправляет текущий посещенный URL-адрес на siteender.heroku.com. Когда siteender.heroku.com получает этот запрос, он проверяет свою БД, чтобы узнать, входил ли кто-нибудь в ту же учетную запись, используя Целевое приложение. Если они есть, их IP-адрес будет отмечен, и siteender.heroku.com сделает запрос GET к целевому приложению (веб-серверу) на этом IP-адресе, попросив цель добавить добавленный в закладки URL-адрес в браузере по умолчанию.
Основная идея заключается в том, что вы можете отправить сайт на свой главный компьютер с вашего iPhone для последующего просмотра, когда вы обнаружите, что iPhone не может справиться со страницей (например, флэш-память, размер экрана).
Очевидно, что основная проблема заключается в том, что с открытым сервером любой может отправить запрос на открытие «seriulousevilwebsite.com» на широкий диапазон IP-адресов, и я навлек чуму на цифровой мир. Поскольку я использую heroku.com в качестве сервера (это невероятно хороший, но облачный хост RoR), я могу' Просто проверьте исходный IP.
Насколько я понимаю HTTPS, для этой настройки мне пришлось бы перебирать сертификаты для каждого целевое приложение? Я согласен с тем, что мне нужна некоторая форма асимметричного шифрования, подписывать исходящие запросы от siteender.heroku.com закрытым ключом (никогда не распространялся) и получать target для выполнения той же операции с использованием открытого ключа и проверки на сходство - но вы правильно догадались, я все еще немного не понимаю, как работает HMAC! Как это асимметрично? Сформулирован ли он таким образом, что выполнение одной и той же операции HMAC с закрытым ключом и открытым ключом будет генерировать одну и ту же подпись? В таком случае - HMAC победитель!
Спасибо тебе за твое терпение!