Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
Тем самым мы решим сразу две задачи – и защиту от CSRF и контроль целостности набора передаваемых параметров – пользователь уже не сможет «поиграться» с полями формы и попробовать добавить или убрать что-нибудь из параметров.
Теперь вы можете подписывать данные, передаваемые через HTTP/REST API
Какую именно задачу вы пытаетесь тут решить?
Подписывать-то можно, но как удостовериться, что данные пришли именно от ожидаемого отправителя?
И чем это лучше банального HTTPS?
Задачу валидации входящих данных из Web-формы (убедиться что набор переданных полей соответствует изначальному набору формы и не изменен пользователем)
также защиту формы от CSRF.
Если секретный ключ знают только отправитель и получатель данных — по подписи и удостовериться.
А зачем вообще передавать эти данные через форму тогда, если пользователь не может их изменить?
Каким образом?
Это если отправитель один. А если их много?
HTTPS шифрует данные, чтобы они не могли быть прочитаны.
можно проверять отправителя — но это сложный способ
и непрактичный, если например клиенты обращаются к API, скажем платежного шлюза и посылают запросы, целостность которых должна быть гарантирована.
Передавая просто идентификтор — мы не можем клиента аутентифицировать.
Второй случай — часто платежная форма инициализируется в виде GET или POST запроса, который происходит на стороне клиента (сабмитится форма в браузере) и в этом случае сервер получающей стороны должен быть уверен что данные сформированы легитимным клиентом и не были изменены.
в чем выигрыш от использования HMAC (по сравнению ...
Эээ, кем предполагается?
… потому что в описываемых автором платежных сценариях по этому https дальше полетят данные моей кредитной карты.
Теми, кто тестирует эти системы.
Автор лишь описывает метод, позволяющий проверить целостность данных, а не их конфеденциальность. И его метод является более защищённым, с точки зрения криптографии, чем просто хэшифрование с секретным значением (и случайными данными).
Вы уже так много материала написали по поводу данной статьи, что можно все комментарии собрать и оформить в виде отдельной статьи со своим видением ситуации.
Про (2) («пожалуйста, опишите пошагово сценарий атаки...») я вообще ничего не писал — этот вопрос относится к автору. Я согласен, что чёткого описания модели угроз в статье нет. Но с другой стороны, это не научная статья, а лишь описание реализации одного из методов (на сколько я это вижу).
А вообще, автор рассматривает один из методов (причём не самый плохой) обеспечения целостности данных, а не универсальный методо защиты от всех существующих и потенциальных атак.
Вопром в том, какие у этого метода преимущества по сравнению с соседними, которые заодно обеспечивают, например, и конфиденциальность.
HTTPS сам по себе обеспечивает лишь конфиденциальность данных, иногда ещё и целостность, при передаче браузер<->сервер (или сервер<->сервер). Но о самих данных он ничего не знает (прсто байтики информации). Ему будет всё ровно «sum=10» или «sum=1000».
Или вы говорите про какие-то другие «соседние методы»?
Эээ, я всегда считал, что если у нас установлено https-соединение, то получающая сторона может быть уверена, что получает именно те данные, которые отправила передающая сторона. Я где-то не прав?
Вы предлагаете мне строить второй уровень шифрования (именно шифрования) поверх HTTPS?
«HTTPS скомпроментирован» как автоматическую компроментацию всего приложения
В критичных приложениях, где без этого не обойтись, — да. В некритичных применять хотя бы целостность сообщений.
А вы не сталкивались с больших компаниями, у которых есть свои ЦС, и которые фильтруют любой трафик, включая HTTPS (и это прописано в политике ИБ)?
Я говорю про свой конкретный сценарий.
Ну, например, можно целиком все сообщение подписывать ЭЦП, или вообще подписывать и шифровать.
В теории действительно более безопасней. А вы пробовали это реализовать на практике?
Основная проблема будет в управлении ключами. Необходимо будет создавать и сопроваждать инфраструктуру открытых ключей.
По вашему, сопровождать shared secret keys чем-то легче?
сбрутили идентификатор
будет работать, и будет достаточно секурно, если это сервер->сервер API взаимодействие.
На странице чекаута на сайте Ромашки есть форма с hidden-полями: merchant_id, order_id, amount, description. Форма сабмитится на URL банка. Лжепокупатель может изменить order_id или amount и оплатить совсем другой счет и более того — на другую сумму.
Сбрутить GUID?См выше про длину инентификатора.
(а) кто является атакующим — пользователь или третья сторона? Если третья сторона, то каким образом она меняет данные?
(б) зачем эта форма вообще показывается пользователю?
См выше про длину инентификатора.
мне кажется, что я уже не раз ответил на все эти вопросы и мы идем на очередной круг.
В остальном логика очень проста – собираем подпись, сравниваем регистронезависимо полученную подпись с подписью, переданной в данных.
Уязвимо в каком случае? Если можно безконтрольно брутить? Какое же решение в таком случае неуязвимо?
Шум от задержек можно сглаживать двумя способами: ...
Метка времени — это хорошо, но в данном случае ее нет.
(Я правильно понимаю, что вы считаете тайминг-атаку пренебрежимой опасностью?)
Автор описывает метод аутентификации данных (с заголовком статьи я не согласен), а не их хранение или формат. Поэтому комментарий не уместен.
Я считаю атаку по времени ещё одним видом атаки, от которой существуют свои методы защиты.
Выглядит вполне безопасно, так ведь? Вы уверены?
Я сомневаюсь. Это уже предел моих знаний о потенциальных векторах атак на схемы такого типа. Но я не уверен, что нет способа взломать и это.
Из которых самый простой — это просто закрыть дырку (не отдавать зависимое от времеи сравнение).
Предположим, мы хотим отправить какие-то данные другому человеку, при этом, и нам и получателю важно убедиться, что данные не будут изменены в процессе передачи.
Почему именно JSON а не простой serialize PHP? Выбор в пользу JSON упал не случайно, поскольку это очень популярный формат сериализации, с которым будет легко работать не только в PHP, но и в любых других популярных языках программирования, таких как Java. Наша реализация должна быть предельно легко переносима на другие платформы и с использованием JSON-сериализации это будет сделать проще всего.
An object is an unordered set of name/value pairs.
Подписываем данные: HMAC на практике в API и Web-формах