アプリから Facebook への呼び出しを検証できるように、アプリの署名を Facebook サーバーに保存する必要がある Facebook Android SDK を Android アプリに実装しています。このシステムを独自のバックエンドに使用して、アプリでのみ使用されるようにしたいと考えています。これに関して、次の質問があります。
(関連するクラスを見つけるには、https://github.com/facebook/facebook-android-sdk/tree/master/facebook/src/com/facebook/androidを参照してください)
- 明らかに、署名を照合して呼び出しを検証するには、アプリの署名をサーバーに送信する必要があります。SDK内で、これがどこで行われているのかわかりませんか?
- httpsが使用されていないようですが、そうですか?(Util.java)
- このシステム全体を無意味にして、署名を盗聴することはできませんか?
- Facebook.java は、ファイルの下部に Facebook アプリの署名を保持します。これを変更するのは簡単なことのように思えるかもしれません。ただし、インテントを送信するアプリの署名を理解する限り、そのインテントを介して解決できます。Android システムがこれを管理するため、署名を偽造することはできません。しかし、URL を呼び出すとき、Android システムは不変の方法で署名をプロトコルに追加できますか? そうではないと思うので、上記の質問について疑問に思います。
[nitzan & zapl に返信して編集]
私が達成しようとしているのは、facebook SDK がサーバーに署名を保存する必要がある理由と同じです。バックエンドへの呼び出しがアプリから送信され、それ以外のものがないことを確認します。ボットや他のアプリがサーバー API にアクセスすることを許可したくありません。facebook SDK には、インテントが Facebook アプリから発信されているかどうかを確認するメソッドがあります。これは、Android システムによる署名とインテントのクローズド管理により安全です。これを妥協する唯一の方法は、アプリの署名をオーバーライドできるようにする変更された Android バージョンを実行することですが、人々が構築して実行する可能性は無視できます。ただし、アプリを実行し、https 以外のプロトコルで送信された署名をスニッフィングし、API 呼び出しでこの署名を使用するアプリを構築することはできません。このようなシステムを機能させるには、https を使用するしかないようです。
上記で説明したインテント検証メソッドは、Facebook サーバーへの URL 呼び出しとは異なることに注意してください。インテントは、デバイス上の Facebook アプリが SDK を実装するアプリと通信するために使用されます。Android システムは、着信インテントで送信される Facebook アプリの署名が偽造できないことを保証するため、Facebook アプリからアプリへの通信システムは安全です。この内部システムとは対照的に、私の質問は、サーバーへの送信 URL 呼び出しの外部システムに関するものです。呼び出しに沿って署名を不変に送信できれば安全であり、基本的にインテント システムと同じシステムを実装します。
[編集2]
私たちが想定していたものとは対照的に、アプリの署名は簡単に取得できることがわかりました。アプリは秘密開発者キーを使用して署名する必要がありますが、これは Android 上のアプリに関するセキュリティを損なうものではありませんが、API 呼び出しのサーバー側の検証には使用できないことは明らかです。
これにより、さらに疑問が生じます。
- 簡単に侵害されてしまうのに、なぜ Facebook はこのシステムを実装しているのでしょうか?
- サーバー API アクセスを特定のアプリのみに制限する既知の実装は他にありますか? (難読化以外)