2016-10-09 9 views
0

私のサーバーに接続してデータを取り出し、このAPIを使用するモバイル(Android)アプリに送信するモバイルAPIを開発しています。サーバーにリクエストを送信するモバイルクライアントを認証するにはどうすればいいですか

サーバーで認証されたユーザーのみがAPIを使用できることを確認します。

APIを使用するユーザー名またはパスワードを与えることはできますが、他のユーザーがユーザー名とパスワードを使用して同じリクエストをサーバーに送信した場合(返信) APIに対するこの攻撃を回避するにはどうすればよいですか?

Googleは署名キーのダイジェストに関連付けられているAPIのようなAPIでAPIキーを使用していることがわかりました。私はそれがどのように働いているのか、それが何かを助けることができるかどうかはわかりません。

実際には、サーバーに要求しているクライアントアプリケーションが自分で開発したアプリケーションと同じであることを確認したいと思います(逆コンパイルと再コンパイルされたバージョンのアプリケーションではありません)。 APIのユーザーを認証するには?

+0

本当にどんな攻撃を防ぐの?ユーザー名とパスワードを持っている人は、どのようにしなければならないのかというすべてのAPIを呼び出すことができます。途中でデータが変更されていないことを確認したい場合は、どのように表示することができます。もしあなたが頻繁にapiを呼び出すのを防ぎたければ、それを解決するもう一つの方法があります。あなたが 'man in the middle attack'攻撃者の –

+0

をあなたのユーザのユーザ名とパスワードで盗むことができます。それはあなたが欲しいものですか? –

+0

送信者のコンテンツを暗号化して、途中で人を過ぎました。しかし、一部の人がモバイルアプリを逆コンパイルしてユーザ名とパスワードを見つけて、ユーザ名とパスワードを使って私のアプリに新しいリクエストを送るとしましょう - 実際に私にリクエストしているクライアントのAPPは、 (自分のコードを逆コンパイルして再コンパイルした別のアプリケーションではない) –

答えて

0

あなたが説明したところから、あなたが望むアプリケーションだけがサーバーAPIを使用できるようにしたいと思っていると思います。

これを確実にするが、いくつかのステップは偉大な保護を行うことができます任意の完全な方法がありません。

1 - あなたはあなたを送信することを許可されているパッケージ名の完全なリストを持っている必要がありますが、あなた

2-要請しますあなたのsdkコード(あなたが言ったaarファイル)を保護し、このaarから開発者のユーザー名パスワードを取る必要がありますので、開発者が以下のようなaarのコードを知る必要はありません:

YourSdkMainClass theInstance = YourSdkMainClass.getInstance( "username"、 "password");

3 - APIを呼び出すたびに(暗号化された文字列を3つにすると便利です)、またはハッシュを生成するメカニズムを選択できるように、アプリケーションpackagenameを取得してユーザー名とパスワードとともに送信する必要がありますアプリケーションの開始時に呼び出される特定のAPIでこれら3つのトークンを使用し、その後に他のAPIを呼び出すためにそのトークンを使用します(使用しないで数時間後にトークンを無効にし、新しいトークンを生成する必要があります)

4 - サーバー側では、受け取ったpackageNameをチェックし、特定の開発者に許可されているpackageName(またはpackageNamesのリスト)と比較する必要があります。すべてがOKならAPI呼び出しに応答する(またはトークンを返す)

注:このシナリオは、packageNameではなくAPKの署名を送信するように改善することができます。署名キーを使用すると、同じpackageNameを持つ複数のアプリケーションがサーバーに要求を送信できなくなる可能性があります。もちろん、サーバー側に開発者のAPKの署名を付ける必要があります(ユーザーにパスワードを与えたいときに質問してください)

aarを良い方法で守ればこれらはすべて完璧です。

+0

proguard apkまたはライブラリーをリバースエンジニアリングすることもできます。誰かがarr(または同様の場合apk)を分解し、aarの論理を見つけて、私のarrのように別のaarを作り直すとします。攻撃者はユーザー名とパスワードも持っているので、サーバに偽のリクエストを送ることができます。 –

+0

兄さん、これはあなたが私に信頼できるベストです。他の方法はありません。あなたが考えるのはそれほど簡単ではありません。あなたがプロガードしている(重要なクラスをプロガードしていない)場合は、送信するものと暗号化の方法を誰もが見つけるのは難しいでしょう。どの文字列もハードコードしないでください。重要な文字列すべてにchar配列を使用してみてください。 –

+0

あなたのsdkを使用している人が攻撃しようとする場合、同じapkと署名で行うことができます。これを許可すると、攻撃を制限する最良の方法です。このような方法でこのapiを使用することはできません。 APIレイヤー(サーバーコード)自体が安全でなければなりません。 –

関連する問題