web-dev-qa-db-ja.com

APIリクエストを自分のモバイルアプリのみに制限する

REST AP​​Iへの投稿リクエストを、自分のモバイルアプリバイナリからのリクエストのみに制限する方法はありますか?このアプリはGoogle PlayとApple App Storeで配布されるため、誰かがそのバイナリにアクセスしてリバースエンジニアリングを試みることを暗示する必要があります。

公開されたすべてのアプリになんらかの方法で署名する必要があるため、アプリの署名に関することを考えていましたが、安全な方法でそれを行う方法がわかりません。おそらく、アプリの署名の取得と、時間ベースのハッシュ、アプリが生成したキーのペア、そしてあいまいなものの古き良きセキュリティの組み合わせでしょうか。

私は可能な限り失敗を証明するものを探しています。理由は、電話センサーによって収集されたデータに基づいてデータをアプリに配信する必要があるためです。ユーザーが自分のアプリを装って、自分のアルゴリズムで処理されなかったAPIにデータを送信できる場合、それは無効になります。目的。

どんなに複雑であっても、私は効果的な解決策を受け入れることができます。錫箔ハットソリューションは高く評価されています。

41
Thiago

アプリに保存されている資格情報は、ユーザーが公開できます。 Androidの場合、アプリを完全に逆コンパイルして簡単に取得できます。

サーバーへの接続でSSLを使用しない場合、ネットワークから簡単に盗聴できます。

真剣に、資格情報を必要とする誰もがそれらを取得するので、それらを隠すことについて心配しないでください。本質的に、あなたはパブリックAPIを持っています。

いくつかの落とし穴があり、パブリックAPIの管理には余分な時間がかかります。

多くのパブリックAPIは、依然としてIPアドレスで追跡し、ターピットを実装して、システムを悪用していると思われる任意のIPアドレスからのリクエストを単に遅くしています。この方法では、同じIPアドレスからの正当なユーザーは、速度は遅くなりますが、引き続き続行できます。

悪意のあるユーザーと同時に無邪気で立っているユーザーをブロックしている可能性があるにもかかわらず、IPアドレスまたはIPアドレスの範囲を遮断する意思がある必要があります。アプリケーションが無料の場合は、期待されるサービスレベルや契約がないため、より多くの自由が得られる可能性がありますが、法的な合意で身を守る必要がある場合があります。

一般に、サービスが人気で、誰かがそれを攻撃したい場合、それは通常良い兆候なので、早い段階であまり心配しないでください。ユーザーが遅いサーバーで待機するのに飽き飽きしたために、アプリが失敗する理由を知りたくありません。

もう1つのオプションは、ユーザーを登録させることです。これにより、不正行為を見つけたときにIPアドレスではなく資格情報でブロックできます。

23
Marcus Adams

いいえ。公開インターフェースを使用してサービスを公開しており、アプリはおそらくこのREST API。アクセスをセキュリティで保護する唯一の方法は、何らかの方法で認証することです。つまり、秘密を保持します。ただし、アプリを公開することもできます。これは、アプリのすべての秘密も基本的に公開されることを意味します。両方の方法を持つことはできません;あなたはあなたの秘密を与えることとそれを秘密に保つことの両方を期待することはできません。

12
kabuko

これは古い投稿ですが、この点についてGoogleからの更新を共有する必要があると思いました。

実際にAndroidアプリケーションが SafetyNetモバイル認証API を使用してAPIを呼び出していることを確認できます。これにより、ネットワークコールにオーバーヘッドがかかり、ルート化されたデバイスでアプリケーションが実行されないようにします。

SafetyNet for iOSに似たものは見つかりませんでした。したがって、私の場合は、最初にログインAPIでデバイス構成を確認し、AndroidおよびiOSに対して異なる対策を講じました。iOSの場合、サーバーとサーバーの間で共有秘密鍵を保持することにしましたiOSアプリケーションはリバースエンジニアリングするのが少し難しいので、この追加のキーチェックはある程度の保護を追加すると思います。

もちろん、どちらの場合も、HTTPS経由で通信する必要があります。

4
Reaz Murshed

あなたにできることは何もありません。あなたが彼らの誰かにあなたのAPIを呼び出せるようにすると、原因になります。あなたができるほとんどは以下の通りです:

(特定のパッケージ名とシグネチャを持つ)アプリケーションのみがAPIを呼び出す必要があるため、apkのシグネチャキーを実用的に取得し、すべてのAPI呼び出しで送信を切断することができます。 (または、アプリがアプリのすべての開始時にそれを呼び出すトークンAPIを用意し、他のAPIにそのトークンを使用することができます-トークンは、何時間も操作しないと無効にする必要があります)

次に、コードを保護する必要があります。そうすることで、誰が送信しているのか、どのように暗号化するのかを誰にも見られないようにします。優れた暗号化を行うと、逆コンパイルは非常に難しくなります。

apkの署名でさえ、いくつかの難しい方法で偽造することができますが、あなたができる最善の方法です。

2
Amir Ziarati

他の回答やコメントが示唆するように、アプリへのAPIアクセスを本当に制限することはできませんが、試行を減らすためにさまざまな対策を講じることができます。 「App-Version-Key」(このキーはコンパイル時に決定されます)などのカスタムヘッダーを使用して(当然のことながらネイティブコードから)APIにリクエストを送信し、サーバーでこのキーを確認して、受け入れるか拒否するかを決定します。また、この方法を使用する場合は、HTTPS/SSLを使用する必要があります。これにより、ネットワーク上でリクエストを表示することにより、他の人があなたのキーを見るリスクが軽減されます。

Cordova/Phonegapアプリに関しては、上記の方法を実行するプラグインを作成します。完了したらこのコメントを更新します。