web-dev-qa-db-ja.com

Web APIを保護するためのベストプラクティスは何ですか?

モバイルアプリがサーバーとデータベースを操作するためのWebサービスAPIを構築する必要があります(ASP.Net MVC 4ですが、ほとんど関係ありません)。ほとんどのアクションではユーザーをサービスに登録する必要はありませんが、アプリのユーザーのみにアクセスを制限したいと思います。

他の場所(たとえば、すべてのデータを必要としている人、または非公式のアプリを作成している人)からの呼び出しが確実に拒否されるようにする方法は何ですか?

私の最初のアイデアは、デバイスがサーバーにトークンを要求することです。トークンはランダムに生成され、そのまま送信されます。他のすべてのメソッドは、リクエストヘッダーにソルトトークンのmd5ハッシュになる特定のヘッダーが含まれていることを確認します。サーバーはトークンとソルトを知っており、ハッシュを計算して送信されたハッシュと比較できます。さらに、トークンは限られた寿命であり、デバイスは1時間おきに別のトークンを取得する必要があります。

それは実装するのが非常に簡単で、100%の証明ではないかもしれませんが、それは良い考えのようです。どう思いますか?

15
Antoine

アプリケーションをリリースするとすぐに、リバースエンジニアリングされる場合があります。つまり、同じアプリケーション(同じバイナリ、同じ設定)がすべてのユーザーに配布されている場合、100%保護するためにできることは何もありません。

ユーザーごとにアプリケーションをカスタマイズできる場合、他のアプリケーションがAPIを使用することを禁止しない可能性がありますが、少なくとも、APIに対して実行できる要求の数によってこのアプリケーションを制限できます。

次のスキーマを想像してみてください:

  1. クライアントが接続し、その一意の識別子(ユーザーごとに1つの識別子)を送信します。
  2. サーバーは、公開鍵で暗号化されたチャレンジを送信して応答します。この公開鍵は、以前に送信された一意の識別子に関連付けられています。
  3. クライアントは、秘密鍵を使用してデータを復号化することで問題を解決し、復号化した秘密をプレーンでサーバーに送信します。
  4. サーバーは、送信された秘密が最初に生成された秘密に対応することを確認します。

アプリケーションをハッキングして秘密鍵を正常に取得する開発者は、自分のアプリケーションからAPIを使用できますが、サーバーのIDになります。

同じユーザーがAPIに1日あたり平均10,000リクエストを実行でき、アクティブユーザーが1日あたり2,000リクエストを実行できる場合、この開発者は自分のアプリケーションを自分で使用し、おそらくそれを友達に与えることができますが、朝のほんの数分しか動かないからといって、彼はそれを数千人に売ることはできないでしょう。

これは役立ちますが、100%証明でもありません。ハッカーが自分のアプリがデバイスにインストールされているときに、アプリから秘密鍵を抽出する方法を見つけた場合はどうなりますか?


あなたの質問には答えませんが、それでも役立つかもしれない付記:APIをツールのツールとして考えないでください主要製品(モバイルアプリケーション)。 これをファーストクラスproduct自体、支払われる可能性のある製品と考えてください。同じモデルが長年使用されていますAmazonやGoogle、AzureなどでMicrosoftが積極的に利用し始めています。

APIを、光沢のある新しいモバイルアプリの従属的なツールとしてではなく、実際の製品として、ユーザーが実際に目にするアプリケーションと同じレベルであると考えるとすぐに、APIを保護する方法についてあまり考えなくなります。他のアプリによる使用法、およびAPIの収益化自体の詳細。このようなAPIは、顧客であるアプリや、だれでも自由に開発した他のアプリで使用できます。これにはいくつかの利点があります。

  • yourアプリケーションでのみ使用されるようにAPIを作成することは困難で費用がかかります。この時間とお金は、もっと便利なものに使うことができます。

  • APIを公開すると、あなたと世界の両方にとって大きなメリットがあります。あなたは素晴らしい建築家であり、優れた開発者であり、驚くほど優れたAPIを作成しましたが、ビジュアルデザイナーのスキルに負けて、インタラクションデザインなどについて何も理解していないと想像してください。APIを非表示にすると、唯一の人々が知っていることは、あなたが使用不可能で醜いモバイルアプリケーションを作成したということです。 APIが公開されている場合、他の開発者はその品質に魅了され、そのための優れたアプリケーションを作成し、多額の資金をもたらします。

  • 他の人があなたのAPIをどのように使用するか想像もできません。これがKinectで起こったことです。当初、マイクロソフトはゲーム用のKinectを作成しました。 MicrosoftがAPIを公開したとき、彼らはそれが数年後に科学的アプリケーション、医療分野などで使用されるとは想像もしていませんでした。これはWeb APIでも同様です。より多くの開発者がそれを使用し、アイデアがより広く普及します。

15