473

JWTを取得してペイロードをデコードできる場合、それはどのように安全ですか? ヘッダーからトークンを取得し、ペイロード内のユーザー情報をデコードして変更し、同じ正しいエンコードされたシークレットで送り返すことはできませんか?

安全でなければならないことはわかっていますが、テクノロジーを本当に理解したいだけです。私は何が欠けていますか?

4

7 に答える 7

567

JWT は、署名、暗号化、またはその両方のいずれかです。トークンが署名されているが暗号化されていない場合、誰もがその内容を読み取ることができますが、秘密鍵がわからない場合は変更できません。そうしないと、受信者は署名が一致しなくなったことに気付くでしょう。

コメントへの回答: あなたのコメントを正しく理解しているかどうかわかりません。念のために言っておきますが、あなたはデジタル署名を知っていますか? 1 つのバリアント (対称型の HMAC ですが、他にも多数あります) について簡単に説明します。

Alice が JWT を Bob に送信したいとします。二人は共通の秘密を知っています。マロリーはその秘密を知りませんが、干渉して JWT を変更したいと考えています。それを防ぐために、AliceHash(payload + secret)はこれを計算して署名として追加します。

メッセージを受信すると、Bob は計算Hash(payload + secret)して署名が一致するかどうかを確認することもできます。ただし、Mallory がコンテンツの何かを変更した場合、一致する署名を計算できません (これは になりますHash(newContent + secret))。彼女はその秘密を知らず、それを見つける方法がありません。これは、彼女が何かを変更すると、署名が一致しなくなり、Bob は JWT を受け入れなくなることを意味します。

たとえば、私が別の人にメッセージを送信{"id":1}し、 で署名したとしHash(content + secret)ます。(ここでは + は単なる連結です)。SHA256 ハッシュ関数を使用し、取得した署名は次のとおり330e7b0775561c6e95797d4dd306a150046e239986f0a1373230fda0235bda8cです。今度はあなたの番です。マロリーの役を演じて、メッセージに署名してみてください{"id":2}。私がどのシークレットを使用したかわからないため、できません。受信者が秘密を知っていると仮定すると、受信者はメッセージの署名を計算して、それが正しいかどうかを確認できます。

于 2014-12-04T18:45:38.637 に答える