前回の記事
前回の記事では作成されたJWTをデコードして中身を確認しました。
今回は作成したJWTを検証してみます。
JWTの検証をやってみる
-
まず,JWTの署名に使われている暗号化形式を調べます
cat jwt_sample.txt eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c awk -F "." '{print $1}' jwt_sample.txt | sed 's/-/+/g; s/_/\//g' | awk '{ l=length($0) % 4; if (l > 0) printf "%s%s", $0, substr("==", 1, l); else print $0 }' | base64 -d {"alg":"HS256","typ":"JWT"}
前回の記事を参照
: -
HS256形式の署名を作成します。
your-256-bit-secret
が共通鍵です。awk -F "." '{print $1 "." $2}' jwt_sample.txt | tr -d '\n' | openssl dgst -hmac "your-256-bit-secret" -sha256 -binary | base64 | sed -e 's/+/-/; s/\//_/g; s/=//g' SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
JWTのヘッダとペイロードを.で連結したものから
tr
で改行を削除し,opensslで作ったバイナリをbase64urlでエンコードしています。
: -
元のJWTの署名部分と比較してみる
awk -F "." '{print $3}' jwt_sample.txt SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
2と同じ値になっているのでJWTが改ざんされていないことがわかります。