2012-01-03 13 views
4

私は、主にデータベースと通信する目的で、私が書いているモバイルアプリケーションで使用するREST APIを開発中です。プライベートAPIを保護するにはどうすればいいですか

example.com/mobileapi/getinfo 

をそして、それぞれの呼び出しと一緒に特定のPOSTペイロードを運ぶ:

モバイルアプリケーションは、このようなURLへの呼び出しを行います。

私は誰かがフィドラーまたはWiresharkのようなネットワーク監視ツールを使用してモバイルアプリケーションを一緒に使用した場合、私は心配することは、彼らはすべての文書化ができている、しかしなど

ユーザー認証について心配していませんURLは、すべてのPOSTパラメータとともに呼び出されます。それは私のAPIを使用する独自のアプリケーションを作成するのに十分な情報です。

どうすればこの問題を防ぐことができますか?私は自分のアプリケーションにKeyをハードコーディングすることを検討し、それを各リクエストにPOSTパラメータとして含めましたが、それも表示されます。

+4

APIをSSL上でのみ応答させることができます。そのようにすれば、監視ツールが見ることができるのはハンドシェーク/ネゴシエーションだけです – rejj

+0

うーん、それについて読まなくてはなりません。 SSLの技術と実装にはあまり慣れていません。しかし、それは良い出発点です。ありがとう – xbonez

+0

これを参照してください:http://stackoverflow.com/questions/8674459/securing-connection-to-php-server-without-ssl –

答えて

9

あなたがしたいことは、相互認証されたSSLを使用することです。これにより、サーバーはアプリケーションからの着信接続のみを受け付け、アプリケーションはサーバーとの通信のみを行います。

ここには、高度なアプローチがあります。自己署名入りのサーバーSSL証明書を作成し、Webサーバーに展開します。 Androidを使用している場合は、この目的でAndroid SDKに付属のkeytoolを使用できます。別のアプリプラットフォームを使用している場合、同様のツールも同様に存在します。次に、自己署名付きのクライアントを作成し、アプリケーション内にリソースとしてカスタムキーストアに配置します(keytoolはこれも生成します)。クライアント側のSSL認証を要求し、生成したクライアント証明書のみを受け入れるようにサーバーを構成します。そのクライアント側の証明書を使用して自分自身を識別し、その部分のサーバーにインストールしたサーバー側の証明書を1つだけ受け入れるようにクライアントを構成します。

アプリ以外の誰かがあなたのサーバーに接続しようとすると、サーバーはあなたのアプリに含まれているクライアント証明書を提示しない受信SSL接続を拒否するため、SSL接続は作成されません。

これは、ここで保証されているよりもはるかに長い答えです。私は段階的にこれを行うことをお勧めします。これは、Android上で自己署名入りのSSL証明書(他のモバイルプラットフォームでこれを行う方法に慣れていない)、つまりサーバー側とクライアント側の両方で対処する方法についてのWeb上のリソースです。 O'Reillyが出版した私の本「Application Security for the Android Platform」にも完全なウォークスルーがあります。

+1

私はこれが古いQ/Aであることを認識していますが、この方法はまだ有効です):コンパイルされたクライアントサイドアプリケーションから誰かが証明書をリッピングして自分の目的で使用することを防ぐには? – EvilJordan

関連する問題