Безопасная отправка токена устройства для APN
Для приложений iOS, требующих push-уведомлений, сначала необходимо запросить у пользователя разрешение на это. После этого генерируется токен устройства, и с этим удаленный сервер может связываться с пользователем через этот токен.
Я прочитал подобный вопрос здесь, и я не чувствую, что этого достаточно. Картинка ниже является доверенным сертификатом, он позволяет мне просматривать весь трафик, который происходит на этом устройстве.
С Fiddler2, а также с CertMaker, я могу прослушивать HTTPS-трафик, что означает, что клиент, вероятно, может знать, какие данные он отправляет и куда.
У меня такой вопрос: зная, что SSL не защищает моих клиентов от просмотра того, что я отправляю на удаленный сервер, должен ли я просто зашифровать секретный ключ, найденный в моем приложении?
Такие как encrypt("device_token","secretkey_a0a0a0a")
(притворись, что это Objective-C)?
Не мог ли кто-то просто найти этот ключ в моем приложении? Я тоже читал этот вопрос, и, похоже, можно было бы вернуть секретный ключ.
Мой план на это выглядит так:
- В приложении iOS создайте случайную строку с именем
activate
, - Зашифруйте (не хеш), токен случайной строкой и секретный ключ, который я только знаю. (Secretkey_a0a0a0)
- Отправьте зашифрованную строку вместе со сгенерированной случайно сгенерированной строкой (активной).
- На сервере я проверяю, могу ли я расшифровать действительный токен с помощью
active
и мой секретный ключ. - Я сохраняю токен в своей базе данных, если он действителен.
Это предотвращает случайный ввод токенов людьми, да, однако, secretkey_a0a0a0
является строковым литералом. Это очень возможно получить в самом двоичном файле приложения.
У меня вопрос, как мне защитить этот секретный ключ? Ответ также может быть, как я могу запретить людям отправлять недействительные токены на мой сервер.
Я слышал о шифровании, но разве это не относится только к файлам ресурсов?
Как мне подойти к этому?
3 ответа
Если вы делаете SSL-Pinning (AFNetworking
это реализовано) вы не сможете (в разумные сроки) перехватить трафик https между клиентом и сервером, если у вас нет закрытого ключа сервера.
Если вы боитесь, что посредник может украсть ваш токен и отправить поддельные push-уведомления пользователям вашего приложения, убедитесь, что это не может произойти. Поскольку запросы к серверам Apple APN должны быть подписаны с помощью файла Pem, основной задачей должно быть обеспечение безопасности файла сертификата, а не токена APN. Если вы хотите предотвратить запись недопустимых токенов в вашу базу данных, вам следует внедрить механизм CRC или нечетного / четного бита.
Возможно, вы захотите проверить раздел безопасности в Руководстве по push-уведомлениям, в частности, раздел "Генерация и рассылка токенов".
Маркер устройства генерируется устройством, подключающимся через APNS Apple. Я предполагаю (они не говорят в документах), что это уникально для данного идентификатора приложения.
APNS тогда, вероятно, будет сопоставлять эти идентификаторы с pem
сертификат, который вы используете для связи с ним, тем самым подтверждая, что push-уведомления действительно исходят из вашего приложения.
В этом случае шифрование токена устройства кажется чрезмерным.
Чтобы не допустить, чтобы кто-то злонамеренно спамил ваш сервер токенами, я бы хешировал токен, когда был секретным ключом, и отправлял и токен, и хеш на сервер. Затем вы можете снова хэшировать токен на сервере, используя свой секретный ключ, и проверить действительность запроса.