私はこのヘッダーを使用して https://jwt.io/ をいじっていました
{
"alg": "HS256",
"typ": "JWT"
}
ペイロード名をAAAAAAAAAAAAAAAAAAAA
のような反復的なものに置き換えると、次のようなトークンが生成されることに気づいたとき:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkFBQUFBQUFBQUFBQUFBQUFBQUFBIiwiaWF0IjoxNTE2MjM5MDIyfQ.hlXlWvaeyOb6OcrOwd-xfWgF8QlfmTycj5WWZwRr6FY
BQUF
サブストリングが繰り返されているように見えます。名前にA
sを追加するほど、BQUF
sが表示されます。
私が知る限り、この種のパターンの存在は、エンコードされたコンテンツを見つけるのをかなり簡単にします。何が欠けていますか?
ここで用語の混乱が少しあります。
[〜#〜] 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 認証された暗号化を想定しています。
tl/dr:選択したバージョンのJWTは何も暗号化せず、簡単に転送できるようにエンコードするだけです。ペイロード内のデータは秘密であることを意図していません。
JWS(署名付きのJWT)があります。あなたが見ているのは単にbase64でエンコードされたデータペイロードです。 JWSに含まれる パーツ :
Base64は単なるエンコード形式であり、暗号化の種類ではなく、データを非表示にすることを意図したものではありません。むしろ、異なるシステム間の転送を容易に耐えられる標準のASCII文字のみで構成されていることを確認します。その結果、2つの期間の間にすべてを取り、それを実行する場合、 base64デコーダーを使用すると、元のペイロードデータが問題なく表示されます。
したがって、キーは単純です。JWSはデータを非表示にするものではありません。 データの整合性を確保することを(署名を通じて)意図しているだけです。つまり、誰かがデータペイロードを変更した場合、署名が一致しなくなったことがわかります。
または、JWE(暗号化を使用したJWT)を使用してデータを非表示にすることもできます。 JWT、JWS、およびJWEの詳細な比較については、 Bob's の優れた回答を参照してください。これらはすべて密接に関連しています。
あなたが欠けているのは、あなたのトークンは署名されている( より正確には、対称鍵で認証されている )が暗号化されていないということです。
上記の質問でトークンを使用する場合は、ピリオドでトークンを3つに分割します(.
)そして、各ピースを base64デコーダー にフィードすると、次のデコードされた出力が得られます。
{"alg":"HS256","typ":"JWT"}
{"sub":"1234567890","name":"AAAAAAAAAAAAAAAAAAAA","iat":1516239022}
トークンの残りの部分の256ビットHMAC認証タグである32のほとんど非ASCIIバイトのシーケンス。ご覧のとおり、すべてのデータは誰でも簡単に読み取ることができます。認証タグは、秘密のHMACキーを知らない人がトークンを変更したり、偽造トークンを最初から作成したりすることを防ぐだけです。