AndroidアプリでFacebook Android SDKを実装しています。このAndroidアプリでは、Facebookからの呼び出しが有効になるようにFacebookのアプリ署名を保存する必要があります。私たちは、私は、次の質問を持って、それが唯一の我々のアプリで使われていることを確認するために私たち自身のバックエンドのためにこのシステムを使用したいとこれに係るたい:Android facebook-sdk署名セキュリティ
(関連するクラスを見つけることがhttps://github.com/facebook/facebook-android-sdk/tree/master/facebook/src/com/facebook/androidを参照してください)
-
を
- 明らかに、署名を照合して呼び出しを検証するには、アプリケーションの署名をサーバーに送信する必要があります。 sdk内で、これがどこで行われたのかわからないのですか?
- httpsが使用されていないようですが、それは間違いありませんか? (Util.java)
- このシステム全体を無意味にするために署名を盗聴することはできませんでしたか?
- Facebook.javaは、ファイルの最後にFacebookのアプリケーションの署名を保持します。これを変更するのは簡単ではないようです。しかし、インテントを送信するアプリのシグネチャは、そのインテントを通じて解決することができます。 Androidシステムがこれを管理しているため、署名を捏造することはできません。しかし、AndroidシステムがURLを呼び出すと、プロトコルに署名が追加されますが、それは不変です。私は、上記の質問に私が不思議に思うのではないでしょうか。 が
[nitzanへの返信で編集& zapl]
私は何を達成しようとしているが、FacebookのSDKはそのサーバー上の署名を保存する必要が理由と同じです。私たちのバックエンドへの呼び出しは、私たちのアプリから送られ、何も送っていないことを確認します。ボットや他のアプリがサーバーAPIにアクセスすることを許可したくありません。 facebook sdkには、インテントがFacebookアプリケーションから発信されたかどうかをチェックするメソッドがあります。これは、Androidシステムによる署名とインテントの管理が閉じられているため安全です。これを妥協する唯一の方法は、変更されたAndroidバージョンを実行することです。これにより、アプリ署名を無効にすることはできますが、ビルドと実行は無視できません。しかし、アプリケーションを実行すると、非httpsプロトコルを介して送信されたシグネチャを傍受し、このシグネチャをAPI呼び出しで使用するアプリケーションを構築することはできません。そのようなシステムを動作させる唯一の方法は、httpsを使用することだと思われます。これは、facebook sdkにはないようです。
上記のインテント検証方法は、FacebookのサーバーへのURL呼び出しとは異なります。インテントは、デバイス上のFacebookアプリをSDKを実装するアプリと通信させるために使用されます。 Androidシステムは、入ってくるIntentと共に送信されたFacebookアプリの署名が偽造されないようにして、Facebookアプリ - アプリ通信システムが安全であることを保証します。この内部システムとは対照的に、私の質問は、サーバーに送信される外部呼び出しシステムのことです。署名が呼び出しに不変で送信される可能性がある場合、基本的にIntentシステムと同じシステムを実装します。我々は仮定したものとしては対向
[編集2]
、それはアプリ署名が容易に取り出されるが判明しました。アプリは非公開の開発者キーを使用して署名する必要がありますが、これはAndroidのアプリに関するセキュリティを脅かすことはありませんが、明らかにAPIの呼び出しをサーバサイドで検証するためには使用できません。
これは、多くの質問につながる:それは簡単に妥協している間
- はなぜFacebookはこのシステムを実装していますか?
- サーバーAPIのアクセスを特定のアプリに限定する他の既知の実装はありますか?(難読化以外)
あなたは正確に何かを保護しようとしていますか? –
こんにちは、私の更新された質問 –
を参照してくださいそれは私が望むサーバーに何かを返すようにFacebookのアプリケーション/ APIを変更することができますので安全ではありません。誰も私がフェイスブックサーバーに私が偽者だと言うように強制しません。 – zapl