0

Мы разрабатываем игру iOS, в которой некоторые пользователи, скорее всего, изменят ответы, возвращенные с созданного без сервера сервера backedend, чтобы обмануть (с помощью поддельных сертификатов MITM). Чтобы в какой-то мере противодействовать этому, мы хотели бы включить подпись, которая будет трудно понять. Эта реализация полностью завершена (и работала на Serverless-Offline, но нам нелегко возвращать необработанный JSON из Lambda из-за ограничений в API Gateway. Нам нужно иметь возможность моментального снимка нашего JSON, чтобы обеспечить что строковая версия находится в том же порядке, когда мы берем контрольную сумму. В противном случае она может быть рассчитана по-разному на стороне iOS, где она уже является строкой до того, как она накачивается в объект.Как я могу подписать ответ от API Gateway и Lambda?

Есть ли какой-либо возможный способ возвращает строку и не иметь API шлюз денется

например:

callback(null, flattened_json_string); 

дает правильный ответ на Serverless-Offline, поскольку он позволяет вам возвращать строку. Когда на самом деле размещается в API-Gateway, мы получаем что-то спасся, такие как:

"{\"metadata\":{\"cmKey\":\"537d1a54916e56bac1d03478b18575e8c0c74d86\",\"cacheReady\":true,\"serverTime\":1467433541108},\"commands\":[]}" 

Я знаю о том, чтобы пройти в блоке, как это, но я не хочу, чтобы быть разобран и вновь строковой и риск порядок меняется из-за контрольной суммы.

Я также знаю, что есть хорошие фреймворки javascript для получения hases объектов, но это, очевидно, недоступна на стороне клиента на iOS.

ответ

0

После нескольких часов работы исправление было на самом деле довольно простым. Мне нужно было изменить тип ответа на text/html, а затем выполнить форматирование перед возвратом.

С бессерверным, я установил следующий

"responseTemplates": { 
     "text/plain": "$input.path('$')" 
     } 

В моем коде, тогда:

callback(null, JSON.stringify(data)); 
1

этого письма, автор имеет ответил на свой вопрос, но есть некоторые вопросы, оказывающие влияние долгосрочная стабильность решения.

Правильное решение состоит в том, чтобы сортировать ключи (обычно в лексическом порядке) перед кодированием или после декодирования объекта и собирать хеш (или, возможно, лучше HMAC?) Канонических данных - отсортированные ключи и значения , Это делает подписание и проверку подлинно детерминированными.

Использование неправильного типа содержимого, чтобы сделать что-то работу, кажется немного отрывочным и хрупким.

Кроме того, должно быть возможно полностью устранить проблему, ожидая, что конкретные сертификаты будут представлены сервером приложений - сертификация в определенном смысле. В этом случае злоумышленник с прокси-сервером MITM и поддельным SSL-сертификатом будет иметь вычислительно-непрактичное время, выдающее себя за сервер приложений.

JSON Web Tokens также кажутся перспективными, но, возможно, не в пределах ограничений вопроса.

+0

Можно ли ожидать получения определенных сертификатов с сервера?В случае, когда клиент хочет перехватить трафик и изменить его, обычно легко доверять альтернативный корневой сертификат, который затем подписывает измененные запросы на лету. – David

+0

Если это ваш сертификат SSL или тот, который вы контролируете, то вы знаете [отпечаток сертификата] (http://security.stackexchange.com/a/35694/32112), который для всех практических целей невосприимчив к подделке. Если вы используете общую конечную точку, например 'https: // example.execute-api.us-east-1.amazonaws.com /', тогда информация должна быть достаточно последовательной и предсказуемой, но, по общему признанию, вне вашего контроля. –

Смежные вопросы