2016-07-05 4 views
1

У нас есть служба, в которой пользователь может зарегистрироваться. Этот процесс защищен reCAPTCHA для предотвращения автоматизированных регистраций. Проблема в том, что на мобильных устройствах reCAPTCHA не является удобством. Поэтому мы решили, что API регистрации также примет некоторые специальные токены вместо ответа reCAPTCHA.Замена Captcha на мобильных устройствах

Теперь вопрос заключается в том, как реализовать этот токен . Наш первый подход состоял в том, чтобы оснастить мобильное приложение некоторым постоянным секретом, который будет отправлен на сервер как токен . Но этот секрет может быть раскрыт, если хакер перенаправляет запрос на свой сервер (путем обновления DNS-записи домена API и установки его сертификата как доверенного на мобильное устройство).

Теперь наш последний подход - вычислить токен как HMAC-SHA1 на имя пользователя + secret (нужен ли нам здесь secred - возможно, только для того, чтобы сделать ввод достаточно длинным?). Имя пользователя будет взято из входа регистрации. Тогда сервер будет авторизовать его, проверив хэш. В его случае можно было бы сделать повторную атаку, но это нормально, потому что дублируемое имя пользователя будет отклонено.

Правильно ли этот подход? Может быть, есть другие альтернативы для перехвата на мобильных устройствах?

Также возможно получить и перепроектировать приложение из iOS (ipa-файла), учитывая, что оно будет размещено в Appstore и извлечь ключ (и секрет)?

В случае андроида это возможно - есть ли способ предотвратить его?

ответ

0

Мы решили пойти с Hawk, чтобы не отправлять учетные данные через провод. Он будет использоваться для iOS, где не должно быть возможности перепроектировать приложение и получить секретный ключ. Для Android мы будем использовать некоторую библиотеку reCAPTCHA для Android.

0

Вы обнаружили недостаток: вы все еще используете токен, который не меняется для одного и того же пользователя. Это нормально в вашем случае использования (регистр), но могут быть другие варианты использования, где это не полезно (например, функция восстановления пароля. В этом случае возможный хакер может генерировать действительные токены для любого пользователя, так как вы запрашиваете имя пользователя).

Мое решение будет:

  • Создать алгоритм (как на мобильных приложений и вашего внутреннего интерфейса), который принимает «маркер открытого» и создает «секретный маркер», который решает капчу. Это может быть простой SHA1 хэш (я не рекомендую), комбинация между открытым токеном и солью, идентификатор пользователя и общедоступный токен и т. Д.
  • Создайте конечную точку на вашем API, которая генерирует публичные и секретные токены , Храните секретный токен в своем сервере и возвращайте публичный токен клиенту (мобильному приложению).
  • После этого приложение должно запросить публичный токен, сгенерировать секретный токен и отправить его в API. API проверяет, что секретный токен уже хранится в вашей базе данных, и, если это так, тогда будет исправлено перехват.

Улучшение будет означать, что хранимые секретные токены истекают через X секунд.

Надеюсь, это поможет!

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