1. ホーム
  2. security

[解決済み] JWTは解読できても、安全性はどうなのか?

2022-03-20 07:14:17

質問

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

セキュアでなければならないことは分かっているのですが、どうしてもその技術を理解したいのです。何が足りないのでしょうか?

解決方法は?

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

コメントへの回答 私はあなたのコメントを正しく理解しているかどうかわからない。念のため:デジタル署名を知っていて、理解していますか?一つのバリエーション(HMAC、これは対称型ですが、他にもたくさんあります)を簡単に説明します。

アリスがボブにJWTを送りたい場合を考えてみましょう。二人はある共有の秘密を知っています。マロリーはその秘密を知らないが、干渉してJWTを変えたいと考えている。それを防ぐために、アリスは次の計算をします Hash(payload + secret) を作成し、これを署名として付加する。

メッセージを受信したとき、Bobもまた Hash(payload + secret) を使用して、署名が一致するかどうかをチェックします。 しかし、Malloryがコンテンツの何かを変更した場合、彼女は一致する署名(これは、以下のようになります)を計算することができません。 Hash(newContent + secret) ). 彼女はその秘密を知らないし、それを知る術もない。 つまり、もし彼女が何かを変更したら、署名はもう一致しなくなり、ボブは単純にもうJWTを受け入れないでしょう。

例えば、私が別の人に次のようなメッセージを送ったとしましょう。 {"id":1} で署名し Hash(content + secret) . (+はここでは単なる連結)。SHA256 Hash関数を使い、得られた署名は以下の通りです。 330e7b0775561c6e95797d4dd306a150046e239986f0a1373230fda0235bda8c . 今度はあなたの番です。Malloryの役になって、メッセージに署名してみてください。 {"id":2} . 私がどの秘密を使ったか分からないので、できません。もし受信者がその秘密を知っていると仮定すれば、彼はどんなメッセージの署名も計算し、それが正しいかどうかをチェックすることができます。