web-dev-qa-db-ja.com

HS256でエンコードされたJWTでパターンを表示できますか?

私はこのヘッダーを使用して https://jwt.io/ をいじっていました

{
  "alg": "HS256",
  "typ": "JWT"
}

ペイロード名をAAAAAAAAAAAAAAAAAAAAのような反復的なものに置き換えると、次のようなトークンが生成されることに気づいたとき:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkFBQUFBQUFBQUFBQUFBQUFBQUFBIiwiaWF0IjoxNTE2MjM5MDIyfQ.hlXlWvaeyOb6OcrOwd-xfWgF8QlfmTycj5WWZwRr6FY

BQUFサブストリングが繰り返されているように見えます。名前にAsを追加するほど、BQUFsが表示されます。

私が知る限り、この種のパターンの存在は、エンコードされたコンテンツを見つけるのをかなり簡単にします。何が欠けていますか?

32
jmacedo

ここで用語の混乱が少しあります。

[〜#〜] jwt [〜#〜] は、クレームの基本的な形式といくつかの標準クレームを定義します。これは、JWTクレームセットがJWSまたはJWE構造のペイロードでなければならないことを指定します。

[〜#〜] jws [〜#〜] は、署名付きのペイロードの構造を定義します。ペイロードは実際にはほとんど常にJWTですが、これは仕様の要件ではありません。最も一般的な形式はJWSコンパクトシリアライゼーションです。これはBase64化されたHeader.Payload.Signatureあなたは精通しています。暗号化は含まれず、署名のみが行われることに注意してください。これは1 トークンが信頼できる当事者によって作成され、変更されていないこと(信頼性)を保証しますが、その内容を隠しません。

[〜#〜] jwe [〜#〜] は、JWSの暗号化された対応物です。 JWSと同様に、ほとんどの場合、JWTペイロードが(プレーンテキストとして)含まれていますが、これは必須ではありません。 JWEコンパクトシリアライゼーションは、JWSの同等のものと多少異なります:Header.Key.IV.Ciphertext.AuthenticationTag。これは1 同じセキュリティが保証されている(信頼性)2 JWSと同様に、キー(機密性)を持たない人にはメッセージを非表示にします。


あなたが持っているものは、具体的には署名されているが暗号化されていないJWSです(HS256アルゴリズム。これは " [〜#〜] hmac [〜#〜] using SHA-256 ")を意味します。暗号化が必要な場合は、代わりに [〜#〜] jwa [〜#〜] で定義された暗号化アルゴリズムの1つを使用してJWEを作成する必要があります。


参考文献:


1 いつものように、「保証」はすべてが正しく構成されていることに依存します。そして、あなたは例えばすべてを暗号化/署名なしのままにするデバッグ構成を使用します。

2 認証された暗号化を想定しています。

27
Bob

tl/dr:選択したバージョンのJWTは何も暗号化せず、簡単に転送できるようにエンコードするだけです。ペイロード内のデータは秘密であることを意図していません。

JWS(署名付きのJWT)があります。あなたが見ているのは単にbase64でエンコードされたデータペイロードです。 JWSに含まれる パーツ

  1. Base64でエンコードされたヘッダー
  2. Base64でエンコードされたデータ
  3. 暗号署名

Base64は単なるエンコード形式であり、暗号化の種類ではなく、データを非表示にすることを意図したものではありません。むしろ、異なるシステム間の転送を容易に耐えられる標準のASCII文字のみで構成されていることを確認します。その結果、2つの期間の間にすべてを取り、それを実行する場合、 base64デコーダーを使用すると、元のペイロードデータが問題なく表示されます。

したがって、キーは単純です。JWSはデータを非表示にするものではありません。 データの整合性を確保することを(署名を通じて)意図しているだけです。つまり、誰かがデータペイロードを変更した場合、署名が一致しなくなったことがわかります。

または、JWE(暗号化を使用したJWT)を使用してデータを非表示にすることもできます。 JWT、JWS、およびJWEの詳細な比較については、 Bob's の優れた回答を参照してください。これらはすべて密接に関連しています。

50
Conor Mancone

あなたが欠けているのは、あなたのトークンは署名されている( より正確には、対称鍵で認証されている )が暗号化されていないということです。

上記の質問でトークンを使用する場合は、ピリオドでトークンを3つに分割します(.)そして、各ピースを base64デコーダー にフィードすると、次のデコードされた出力が得られます。

{"alg":"HS256","typ":"JWT"}
{"sub":"1234567890","name":"AAAAAAAAAAAAAAAAAAAA","iat":1516239022}

トークンの残りの部分の256ビットHMAC認証タグである32のほとんど非ASCIIバイトのシーケンス。ご覧のとおり、すべてのデータは誰でも簡単に読み取ることができます。認証タグは、秘密のHMACキーを知らない人がトークンを変更したり、偽造トークンを最初から作成したりすることを防ぐだけです。

14
Ilmari Karonen