web-dev-qa-db-ja.com

REST APIセキュリティ:HMAC /キーハッシュとJWT

私は 数年前のこの記事 を読みましたが、REST APIを保護するための賢い方法を説明しています。基本的に:

  • 各クライアントには一意の公開/秘密鍵のペアがあります
  • クライアントとサーバーだけが秘密鍵を知っています。有線で送信されることはありません
  • リクエストごとに、クライアントはいくつかの入力(リクエスト全体、現在のタイムスタンプ、秘密鍵)を受け取り、HMAC関数を介して実行して、リクエストのハッシュを生成します。
  • 次に、クライアントは通常のリクエスト(公開鍵を含む)とハッシュをサーバーに送信します。
  • サーバーは(提供された公開鍵に基づいて)クライアントの秘密鍵を検索し、要求が リプレイの犠牲者でないことを確認するタイムスタンプチェック(確かに理解できません)を実行します攻撃
  • すべてが順調であれば、サーバーは秘密鍵と同じHMAC関数を使用して、リクエストの独自のハッシュを生成します。
  • 次に、サーバーは両方のハッシュ(クライアントが送信したハッシュと生成したハッシュ)を比較します。それらが一致する場合、リクエストは認証され、続行が許可されます

次に、 [〜#〜] jwt [〜#〜] に遭遇しました。ただし、最初の記事ではJWTについてはまったく触れられていないため、JWTが上記の認証ソリューションと異なるのかどうか、またそうでない場合はどのようになっているのかと思います。

17
smeeb

非常に基本的な答えから始めましょう。

JWT(OAuthおよびOpenID)のコンテキストで使用される)は、クライアントとAPIの間で共有される秘密を必要としません。3つのコンポーネントがあり、2つのペアがそれぞれ秘密を共有します:クライアント<->識別サーバー、識別サーバー<-> API。

これにより、ほとんどの複雑さがAPIから識別サーバーに移動します。APIは、トークンが識別サーバーによって発行され、調整されていないことを確認するだけです。 APIがJWT署名がIDサーバーとAPI間の既知の単一の共有シークレットで有効であることを確認することを確認するにはそれでおしまい!

識別サーバーがユーザーIDを検証する方法はさまざまですが(多くの場合、TLS接続を介した古いユーザー名とパスワードのペアです)、APIには影響しません。

JWTを使用する場合のメッセージとトークン自体のプライバシーとセキュリティはTLSによって処理されるため、JWTはそのような問題を認識していません。

8
Patrick