モバイルアプリケーション用にいくつかのRestful APIを作成しています。
APPとWebサーバー間の通信はRESTで行う必要があります。これらのapiは非公開である必要があり、成功した結果を得るためにこれらのAPIを呼び出すことができるのは私のアプリのみである必要があります。
難しいのは、アプリにユーザーIDとパスワードが必要ないため、基本的なユーザー認証なしでモバイルアプリでREST APIを制限する方法がわからないことです。
私が考えた解決策の1つは、ある種のハードコード文字列を埋め込むことでした。そのため、モバイルアプリがRESTful URLを使用するときに、SSLを介して暗号化形式で渡します。しかし、私はこれが非常に悪い解決策のように見えることを知っています。
このような状況で何が最善の解決策であるかを親切に提案してください。
ハッシュベースのメッセージ認証コード(HMAC)メカニズムを見てください。
ウィキペディアのリンク: http://en.wikipedia.org/wiki/Hash-based_message_authentication_code
クライアント(モバイルアプリ)には、REST Webサービスクライアントとプライベート/暗号キーを識別するパブリック APIキーが必要です。パブリックAPIキーはHTTPリクエストと一緒に送信できます。公開されており、誰でも見ることができます。ただし、秘密キーはリクエストと一緒に送信しないでください。サーバーとクライアントだけが知っている必要があります。このキーは、代わりにサーバーに送信されるハッシュ化されたメッセージHMACは、SHA1/MD5アルゴリズムを使用して生成できます。このメッセージは、サーバーとクライアントの両方が知っているアルゴリズムによって生成されるメッセージであり、最後に秘密鍵です。
アプリに埋め込まれたキーは、パケットスニファやその他のさまざまな手法で簡単に取得できます。この問題は、次の手順で解決できます。
参考までに:上記の手順は広く受け入れられている標準であり、 ダイジェスト認証 と呼ばれています。さらにサポートが必要な場合は、Googleに「Android httpダイジェスト認証」を要求してください。
数学的に難しい問題を導入し、それに応じてハードコーディングされた文字列を変換することで、リバースエンジニアの仕事を難しくすることはできますが、 Nasir が言っているように、それを完全なものにすることはできません。
これはどう。アプリにハードコード化された数値A
があるとします。サーバーは2つの数値B
&P
を送信します(Pは大きな素数です)。これで、(A^B) % P
を使用してサーバーによって検証される実際の数を計算できます。アプリが(A^B)%P
の回答をServer's Public Key
で暗号化するようになりました。サーバーはそれを秘密鍵で復号化して検証し、有効期限付きのトークン(おそらくjwt)を発行します。その後、アプリとサーバーはそのトークンを使用して通信できます。アプリの起動時に一度計算を実行し、トークンを保存して後で使用できます。
タイムスタンプ+ appId +サーバーでレプリケートできるその他の値で構成されるアプリで複雑なトークンを作成し、それらを使用して各リクエストのヘッダーで認証することをお勧めします。
たとえば、dbに仮想「ユーザー」を作成し、それにdeviceTokenを格納して、アルゴリズムに使用できます。
私は個人的に1つのAPIリクエストを公開しています。これはタイムスタンプゲッターで、300秒以内に使用するサーバーのタイムスタンプを返します。
そのため、各リクエストの前に、タイムスタンプを取得して、作成したトークンを送信し、サーバーに複製して、リクエストを認証します。
平凡なハッカーはアプリをリバースエンジニアリングしてトークンを複製できます