1. JWT (JSON Web Token) とは
JSON Web Token (JWT) とは、RFC 7519 で以下のように定義されています。
JSON Web Token (JWT) is a compact, URL-safe means of representing claims to be transferred between two parties.
JWT は、二者間で転送されるクレーム(属性情報)を表現するためのコンパクトで URL Safe な方法です。
Wikipedia には、以下のように記載されています。
JSON Web Token(ジェイソン・ウェブ・トークン)は、JSONデータに署名や暗号化を施す方法を定めたオープン標準 (RFC 7519) である。略称はJWT。
簡単にいうと JWT (ジョット)は、ユーザー情報などを JSON 形式で保持して、内容の改ざんを検知することができるトークンです。
JWT に関連のある仕様は、以下になります。
- JWS (JSON Web Signature - RFC 7515):署名付きのメッセージ表現
- JWE (JSON Web Encryption - RFC 7516):暗号化のメッセージ表現
- JWK (JSON Web Key - RFC 7517):暗号鍵の JSON 表現
- JWA (JSON Web Algorithms - RFC 7518):JWS などで扱われる暗号アルゴリズム
ちなみに Web におけるトークン (Token)とは、サーバーが必要とするクライアントの認証情報を含んだ文字列のことです。JWT の他にも Access Token や ID Token 、Refresh Token などがあります。
最近の Web サイトや Web アプリケーションでは、多くの使い道で JWT が使用されています。(流行りの技術らしいです)
JWT は主に、以下のような特徴を持っています。
- 改ざんの検証をすることができる (一番の特徴だと思う)
- 実施あのデータが JSON 形式のオブジェクトである
- URL Safe である (URL に含まれるできる文字列のみで構成されている)
- コンパクトにやり取りを行うことができる
そして JWT は、以下のような機能や場面で使用されることが多いです。
- ログイン機能などの認証(Authentication)
- アクセス許可(Authorization)
- ユーザー情報の保持 (カート情報など)
- etc.
3.2. 脆弱な HMAC 鍵をブルートフォースによる特定
これは、JWT の署名の生成に使用される共通鍵が脆弱な(短い)文字列の場合に、その文字列をブルートフォースによって特定することで有効な JWT を生成することができる攻撃手法です。
元々 HMAC のような単一の鍵を使用するアルゴリズムは、署名と検証を早く実行できるというメリットがあります。速度を優先して効率よく実行することができますが、総当たり攻撃に対する耐性を考えたら、危険性が高まります。
実際に総当たりのブルートフォースを行う場合は、以下のようなツールを使用することで特定できたりします。本記事では、各ツールの詳細は省略します。(後に追記か別でまとめるかも)
対策としては、 単純に HMAC で使用する鍵の長さを長くすることになります。RFC 7518 の3.2 には以下のように記載されています。
A key of the same size as the hash output (for instance, 256 bits for "HS256") or larger MUST be used with this algorithm.
ここの256ビットとは、ASCII 文字の32個に相当します。そのため、32文字を最小数として使用することがおすすめされています。
ただそれ以前に、一般的な総当たり攻撃の対策で一定以上のアクセス処理がされた場合に、アカウントロックのような機能を備えている場合もあります。そのため重要な情報を扱う場面では、別で対策を施しておいた方が無難だと思われます。
対策
これにより、脆弱な HMAC 鍵をブルートフォースによる特定を回避することができます。