モバイル コンパニオン (最初は iPhone のみ) を持つ Web サイトを設計しています。Web サイトは ASP.Net MVC 3 アプリケーションになります。また、サービスを iPhone アプリケーションに公開するための ASP.Net Web API サイト (MVC 4) も用意します。iPhone アプリには、ユーザーからユーザー名とパスワードを取得し、それを JSON ヘッダーで Web API に送信するための独自のフォームがあります。
後からではなく、最初からセキュリティを考えたい。私は決してセキュリティの専門家ではありません。私は、Web サービスからのモバイル アプリケーション クライアントの認証を他の人がどのように処理しているかを確認するために、かなりの調査を行いました。サードパーティの oAuth に接続する必要のない適切なソリューションを思いついたと思います。
あらゆる意見、アドバイス、批判、一般的な WTF を提供していただければ幸いです。:)
私の最大の懸念は次のとおりです。
- Web API への呼び出しが承認されていることを確認する
- リプレイ攻撃のリスクを最小限に抑える (したがって、以下の呼び出しのタイムスタンプ)
iPhone アプリは次のように開発されます:
2 つの文字列が iPhone アプリにハードコードされます (すべてのユーザーに対して同じ値):
- アプリケーション ID
これは、Web API にアクセスしているクライアントのタイプ (iPhone、Android、Windows phone など) を識別するために使用される文字列です。 - アプリケーションのハッシュ ソルト
これは、ユーザーに依存しない要求のハッシュをソルトするために使用される文字列です。
2 つの文字列が iPhone アプリのローカル データベースに保存されます (各ユーザーに固有の値)。
- API ユーザー アクセス トークン
これは、認証の成功時に Web API によってクライアントに提供される文字列 (トークン) であり、クライアントは各要求でユーザー名とパスワードを送信せずに Web API にアクセスできます。 - ユーザーのハッシュ ソルト
これは、確立されたユーザー アカウントに対して行われた要求のハッシュをソルトするために使用される文字列です。
iPhone は次の方法で Web API を呼び出します。
API メソッド: アカウントの作成
クライアントの送信:
- 新しいアカウント データ (ユーザー名、パスワード、姓、名など)
- アプリケーションID
- UTC タイムスタンプ
- UTC タイムスタンプのハッシュ + アプリケーションのハッシュ ソルトでソルトされたアプリケーション ID
API の戻り値:
- 新規ユーザーのハッシュ ソルト
ここでの考え方は、アカウントを作成するときに、アプリケーションのハードコードされたソルトを使用できるということです。ソルトが (逆コンパイルまたはその他の手段によって) 流出したとしても、大きなセキュリティ リスクではないからです。
ただし、ユーザーのデータにアクセスして変更するメソッドについては、そのユーザーのみが所有するソルトを使用するので、攻撃者が他のユーザーになりすますためにソルトを使用することはできません。
API メソッド: アカウントの取得
(Web サイトで作成されたがまだ iPhone で同期されていないアカウントのユーザーのハッシュ ソルトを取得するために使用されます。そのユーザー名のレコードはありません。)
クライアントは次を送信します。
- ユーザー名
- パスワード (アプリケーションのハッシュソルトでハッシュ化)
- アプリケーションID
- UTC タイムスタンプ
- UTC タイムスタンプのハッシュ + アプリケーションのハッシュ ソルトでソルトされたアプリケーション ID
API の戻り値:
- 既存ユーザーのハッシュソルト
API メソッド: ログイン (認証)
クライアント送信:
- ユーザー名
- パスワード (ユーザーのハッシュソルトでハッシュ化)
- アプリケーションID
- UTC タイムスタンプ
- UTC タイムスタンプのハッシュ + ユーザーのハッシュソルトでソルトされたアプリケーション ID
API の戻り値:
- API ユーザー アクセス トークン
API メソッド: 任意のコマンド (つまり、投稿の作成、プロファイルの更新、メッセージの取得など...)
クライアントが送信するもの:
- コマンドデータ
- API ユーザー アクセス トークン
- アプリケーションID
- UTC タイムスタンプ
- UTC タイムスタンプのハッシュ + アプリケーション ID + ユーザーのハッシュ ソルトでソルトされた API ユーザー アクセス トークン