web-dev-qa-db-ja.com

JWT IDクレーム付きのワンタイムJWTトークン

パスワードリセット機能のために使い捨てのJWTトークンを発行し、それをステートレスに保つ方法を理解しようとしています。出会った JWT付きのシングルユーストークン これは基本的に、現在のパスワードのハッシュを含めることを提案し、パスワードが正常に変更されると無効化されます。

JWTにパスワードハッシュを含めることに不安があるので、少し調べて JWT ID仕様 を見つけましたが、トークン検証でチェックできるようにIDをどこかに保存する必要があります。

だから私の質問は、電子メールで送信されるパスワードリセットリンクトークンに現在のパスワードハッシュを含める場合、セキュリティ上の懸念は何ですか?

パスワードを使用する代わりに、JWT IDを使用して、データベースのどこかに列として追加する方が良いでしょうか?

7
norbertpy

私は自分のセキュリティを導入するのをためらっていますが、ここでそれを楽しむためだけに考えています。

パスワードハッシュを含める代わりに、JWTを生成するときに次のプロセスに従います。

  1. パスワードハッシュを取得する
  2. サーバー側の秘密鍵を取得します(256ビットのエントロピーで実行できます)
  3. 有効期限のタイムスタンプを計算します。たとえば、現在時刻から1時間です。
  4. 1 + 2 + 3を超える新しいハッシュを作成する
  5. JWTにハッシュと有効期限のタイムスタンプを含める

パスワードリセットリクエストを検証するには:

  1. パスワードハッシュを取得する
  2. サーバー側の秘密鍵を取得する
  3. JWTから有効期限のタイムスタンプを読み取る(そしてチェックする)
  4. 1 + 2 +3で新しいハッシュを計算する
  5. JWTのハッシュと比較する

この方法では、パスワードハッシュを公開せず、シークレットキーをブルートフォースすることなくブルートフォースすることはできません(何百万年もかかります)。また、タイムスタンプを埋め込むことにより、再利用からハッシュを除外します。

7
John Wu