Безопасная отправка токена устройства для APN

Для приложений iOS, требующих push-уведомлений, сначала необходимо запросить у пользователя разрешение на это. После этого генерируется токен устройства, и с этим удаленный сервер может связываться с пользователем через этот токен.

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

С Fiddler2, а также с CertMaker, я могу прослушивать HTTPS-трафик, что означает, что клиент, вероятно, может знать, какие данные он отправляет и куда.

У меня такой вопрос: зная, что SSL не защищает моих клиентов от просмотра того, что я отправляю на удаленный сервер, должен ли я просто зашифровать секретный ключ, найденный в моем приложении?

Такие как encrypt("device_token","secretkey_a0a0a0a") (притворись, что это Objective-C)?

Не мог ли кто-то просто найти этот ключ в моем приложении? Я тоже читал этот вопрос, и, похоже, можно было бы вернуть секретный ключ.

Мой план на это выглядит так:

  1. В приложении iOS создайте случайную строку с именем activate,
  2. Зашифруйте (не хеш), токен случайной строкой и секретный ключ, который я только знаю. (Secretkey_a0a0a0)
  3. Отправьте зашифрованную строку вместе со сгенерированной случайно сгенерированной строкой (активной).
  4. На сервере я проверяю, могу ли я расшифровать действительный токен с помощью active и мой секретный ключ.
  5. Я сохраняю токен в своей базе данных, если он действителен.

Это предотвращает случайный ввод токенов людьми, да, однако, secretkey_a0a0a0 является строковым литералом. Это очень возможно получить в самом двоичном файле приложения.

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

Я слышал о шифровании, но разве это не относится только к файлам ресурсов?

Как мне подойти к этому?

3 ответа

Решение

Если вы делаете SSL-Pinning (AFNetworking это реализовано) вы не сможете (в разумные сроки) перехватить трафик https между клиентом и сервером, если у вас нет закрытого ключа сервера.

Если вы боитесь, что посредник может украсть ваш токен и отправить поддельные push-уведомления пользователям вашего приложения, убедитесь, что это не может произойти. Поскольку запросы к серверам Apple APN должны быть подписаны с помощью файла Pem, основной задачей должно быть обеспечение безопасности файла сертификата, а не токена APN. Если вы хотите предотвратить запись недопустимых токенов в вашу базу данных, вам следует внедрить механизм CRC или нечетного / четного бита.

Возможно, вы захотите проверить раздел безопасности в Руководстве по push-уведомлениям, в частности, раздел "Генерация и рассылка токенов".

Маркер устройства генерируется устройством, подключающимся через APNS Apple. Я предполагаю (они не говорят в документах), что это уникально для данного идентификатора приложения.

APNS тогда, вероятно, будет сопоставлять эти идентификаторы с pem сертификат, который вы используете для связи с ним, тем самым подтверждая, что push-уведомления действительно исходят из вашего приложения.

В этом случае шифрование токена устройства кажется чрезмерным.

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

Другие вопросы по тегам