Подтвердить что ты не робот

Как facebook проверяет подлинность приложения с помощью хэша ключа?

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

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

Какие данные отправляются из приложения android и под каким шифрованием можно проверить этот хэш на сервере? Является ли метод, реализованный в facebook, безопасным?

Если это так, и он может быть реализован на любом сервере, я мог бы использовать его для проверки на моем сервере, что мои приложения не были перекомпилированы с другим кодом (что обычно случается довольно часто:()


В настоящее время я реализую эту идею следующим образом:

Signature[] sigs = context.getPackageManager().getPackageInfo(context.getPackageName(),     PackageManager.GET_SIGNATURES).signatures;
for (Signature sig : sigs) {
    verifyInServer(sig.hashCode());
}

Где verifyInServer является псевдокодом для проверки, сделанной против сервера, с сохраненным значением подписей. На данный момент это работает, но я не уверен, что это безопасно, и я бы предпочел проверить хэш-ключ (что его публикация), чем эти данные подписи (что я не уверен, что он частный и не spoofable пользователем).

4b9b3361

Ответ 1

Это встроенное приложение Facebook через SDK, которое проверяет подпись приложения - API, встроенного в ОС Android - оно проверяет, соответствует ли он хешу или нет, Хэш - это своего рода открытый ключ, когда приложение подписывается закрытым ключом.

Можно использовать JS SDK для входа в систему пользователя вместо собственного приложения, а затем хеш не будет проверен (может быть подделан). В любом случае, они считают, что это не проблема, так как в таких обстоятельствах пользователь увидит, в каком приложении он входит в систему и должен разрешить доступ в любом случае (поток входа проходит через сервер FB и показывает имя приложения). Вы не можете обманывать uid в cookie Facebook здесь.

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

Ответ 2

Ответ @Zbysek, вероятно, правильный, так как очень вероятно, что приложение Facebook - это тот, который фактически выполняет проверку. Без исходного кода этого приложения это трудно понять наверняка, но мы можем вывести некоторые вещи из проверки исходного кода проекта библиотеки Facebook API, в частности процесса входа в систему, закодированного в классах AuthorizationClient и Session.

  • Прежде всего, клиент проверяет, что приложение Facebook сам правильно подписан. Это ожидается, так как вы не хотите предоставить свои учетные данные для поддельного приложения, представляющего Facebook. Это делается в классе NativeProtocol (а также в класс Facebook для устаревших методов). Это единственное упоминание о подписях в API, поэтому, если есть дополнительные проверки, они либо выполняются самим приложением Facebook, либо на сервере.

  • Session.open() в конечном итоге создает AuthorizationClient, который пытается использовать ряд возможных обработчиков. Один из них (первый используется, если это разрешает SessionLoginBehavior) - это приложение Facebook (например, с KatanaLoginDialogAuthHandler, но есть и другие).

  • Эти объекты AuthHandler в конечном итоге используют tryIntent() для вызова startActivityForResult() для вызова самого приложения Facebook.

Итак, чтобы подвести итог, процесс входа в систему:

  • проверяет, что приложение Facebook является законным,
  • завершает вызов Activity внутри приложения Facebook,
  • вызывает его передачу идентификатора приложения FB и некоторых других данных
  • из действия внутри вашего приложения, через startActivityForResult().

Это ключевая часть, так как действия, начинающиеся с startActivityForResult() (но не, начинающиеся с startActivity()), могут использовать getCallingActivity(), чтобы узнать идентификатор (имя пакета и класса) вызывающего абонента.

Поэтому приложение Facebook может легко использовать эту информацию для запроса PackageManager, получения вашей подписки приложения, передачи этих данных вместе с идентификатором приложения на сервер и проверки их соответствия. И поскольку приложение Facebook подписано, ваше приложение может доверять этому результату.

Я признаю, что это все предположения, но кажется правдоподобным, учитывая то, что мы знаем:)

К сожалению, это также означает, что вряд ли этот механизм может быть реплицирован для вашего собственного использования гарантирующей аутентичности. Если вы не являетесь Facebook или Google (у Google Play Services есть аналогичная функция проверки подписи, например, для Карт) или может каким-то образом гарантировать, что ваше второе приложение также будет доступно на каждом устройстве.