私は、RESTサービス用のAPIを作成しています。これは、作成と消費の両方を行います。私は過去数日間、認証をうまく処理する方法を見つけようとして過ごし、最終的に何かを思いついたと思います。
アプリケーションスタックに関する次の事実に基づいて、これを考えています。
- クライアントとサーバーは.NET4にあります(クライアントプロファイルのクライアント部分)
- サーバーはWCF RESTを使用して公開します
- アプリのユーザー名とパスワードをメモリに保持したくない
3から、トークン認証の形式を使用したかったため、サーバーによって資格情報が検証された後、クライアントはアプリの残りの部分で使用するトークンを取得します(これにより、ユーザーのタイムアウト、Webバージョンとデスクトップバージョン間でのシームレスなユーザーの移動など)。通話をリプレイし、改ざん防止する方法を考えた後、次のことを思いつきました。
- クライアントは認証を試みる前に、
ECDiffieHellmanCng
クラスを使用してDiffie-Hellmanキーペアを生成します。 - 鍵ペアの公開部分をユーザー名とパスワードとともに有線で送信します(もちろんHTTPS経由)。
- サーバーはユーザー名とパスワードの組み合わせを認証し、成功した場合、次のことを行います。
- 一意のセッショントークンを作成します
- 独自のDHキーペアを生成し、クライアントから提供された公開キーから共有シークレットを計算します
- データベース内のセッショントークン、共有シークレット、ユーザー、および「最終アクション」時間(ローリング有効期限ウィンドウに使用)をメモします。
- セッショントークン、その公開DHキー、および認証成功メッセージを返します
- クライアントは、応答からDHキーを取得し、共有シークレットを計算し、トークンとシークレットの両方をメモリに保存します。
この時点から、セッショントークン/シークレットの組み合わせは、他のほとんどのREST APIと同様に機能し、要求のフィンガープリントとタイムスタンプが付けられ、何らかのHMACが生成されます。クライアントがサーバーに対してアクションを実行するたびに、トークン/シークレットペアをチェックし、有効で期限切れでない場合はアクションを許可し、セッションの最後のアクションレコードを更新します。
明らかな欠陥は見当たらず、おそらくこのために過剰に設計されていますが、ある時点でこれを行う方法を学ぶ必要があります。HMACはリプレイ攻撃を防ぎ、DHネゴシエーションはMITM攻撃を防ぐのに役立ちます(HMAC / DHの間で頭の上の実行可能な攻撃を考えることはできません)。
誰でもこれを突くことができる穴はありますか?