web-dev-qa-db-ja.com

JWTの「秘密」とは何ですか?

JWTをJava = Jerseyを使用して開発されたAPI REST APIに適用します。このライブラリをJWTに使用しています- https://github.com/ auth0/Java-jwt

JWT-秘密について質問が少ない

  1. このSecretは一意でなければなりませんか?
  2. 秘密にユーザーのパスワードのハッシュバージョンを使用しますか? (とにかく一意ではありません)これは、ユーザーがパスワードを変更すると、トークンが自動的に無効になるためです。
19
PeakGen
  1. このSecretは一意でなければなりませんか?

これはアプリケーションに固有でなければなりません—結局、secretである必要がありますが、トークンごとに固有ではありません。むしろ、特定の時点で比較的少ない数の秘密鍵を使用する必要があります(たとえば、通常は1つの鍵のみを持っていますが、次から次へと回転するときに2つの鍵を持っている短い期間があります)。

  1. 秘密にユーザーのパスワードのハッシュバージョンを使用しますか?

いいえ、2つの理由から:

  1. ユーザーがGoPackers123などの比較的安全でないパスワードを持っているとします。秘密のパスワードを使用するということは、特定の潜在的なパスワードを誰かが簡単にテストして、正しい署名になるかどうかを確認できるということです。そして、さらに重要なことは、膨大な数の潜在的なパスワードを簡単にテストして、それらのいずれかが正しい署名を与えるかどうかを確認することです。これはオフライン攻撃であるため、発生を知ることすらできません。
  2. そのためには、秘密を保持する必要があるすべてのシステムにすべてのユーザーのパスワードハッシュを配布する必要があります。少数のユーザーがいる場合、これはあなたの秘密配布メカニズムにかなり深刻な負担になる可能性があります。
20
ruakh

JWTおよび Java-jwt ライブラリは、署名のsymmetricおよびasymmetricアルゴリズムの両方をサポートします。

  • HS256などの対称アルゴリズムを使用する場合、署名の署名と検証に使用するキーは1つだけになります。

  • RS256などの非対称アルゴリズムを検討する場合、秘密鍵と公開鍵があります。サーバーで秘密鍵を安全に保ち、トークンに署名するためにそれを使用します。公開鍵を使用して署名を検証します(署名を検証する必要がある人と共有することもできます)。

決してトークンに署名するために使用されるキーを共有しないでください

そして、トークンに署名するための一連の異なるキーを持つことを妨げるものは何もありません。この状況では、 kid ヘッダーパラメーターを使用して、トークンの署名に使用されたキーを示すことができます。この主張は、キーそのものではなく、キー識別子を運ぶことになっています。

kid クレームの詳細については、この answer を参照してください。

9
cassiomolin

RSA256、つまり秘密/公開鍵ペアを使用します(「秘密」は不要です)。そうすれば、秘密鍵を秘密にして安全に保つことができ(トークンの署名にのみ使用されます)、公開鍵を使用して署名が正しいことを確認できます。

トークンの署名が正しいことを確認する必要がある人またはサービスに公開鍵を与えることができます。

2