エンジニアライフスタイルブログを運営しているミウラ(@miumiu06171)です。
普段はフリーランスでシステムエンジニアをしております。
今回は、Pythonのpyjwt + cryptographyを使ってRSA-SHA256(RS256)アルゴリズムで署名するときのエンコード(符号化)とデコード(復号化)する方法を紹介していきます。
動作確認には、Visual Studio Code (VS Code) を使用しているため、同様に確認したい方は、こちらの記事でVS CodeのPython開発環境を構築してみてください。
概要
JSONのペイロードデータをRS256アルゴリズムと秘密鍵(Private Key)でエンコードし、JWTトークンを生成します。
そして、RS256アルゴリズム、JWTトークン、公開鍵(Public Key)を使ってデコードし、元のJSONのペイロードデータを読み取れるか確認していきます。
事前準備
RSA-SHA256(RS256)アルゴリズムで署名するために事前準備として秘密鍵と公開鍵を生成します。
秘密鍵の生成(ssh-keygen)
秘密鍵を生成するには、以下のssh-keygenコマンドを実行します。
1 |
ssh-keygen -t rsa -b 4096 -m PEM -f id_rsa |
カレントディレクトリに「id_rsa」というファイル名の秘密鍵が生成されていればオッケーです。
公開鍵の生成(openssl)
次に公開鍵を生成するには、以下のopensslコマンドを実行します。
1 |
openssl rsa -in id_rsa -pubout -outform PEM -out id_rsa.pub |
カレントディレクトリに「id_rsa.pub」というファイル名の公開鍵が生成されていればオッケーです。
Windowsでopensslコマンドが実行できないときの対処方法
公開鍵の生成でopensslコマンドが実行できなかった場合、以下の記事をもとにWindowsにopensslをインストールしてから再度試してみてください。
pyjwtでRS256アルゴリズム署名を行う方法
pyjwtインストール
Pythonのpyjwtライブラリをインストールするため、以下のコマンドを実行します。
1 |
pip install pyjwt |
cryptographyインストール
Pythonのcryptographyライブラリをインストールするため、以下のコマンドを実行します。
1 |
pip install cryptography |
RS256と秘密鍵(id_rsaファイル)でpyjwtのエンコード
RS256と秘密鍵(id_rsaファイル)でpyjwtエンコードするサンプルコードは、以下のとおりです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
import jwt priv_key_path = "id_rsa" pub_key_path = "id_rsa.pub" payload_data = { "id": "1000", "name": "Sato", "email": "sato@test.com" } with open(priv_key_path) as private_key: encoded_jwt = jwt.encode(payload_data, private_key.read(), algorithm="RS256") print(encoded_jwt) with open(pub_key_path) as public_key: decoded_jwt = jwt.decode(encoded_jwt, public_key.read(), algorithms=["RS256"]) print(decoded_jwt) |
pyjwtのencodeメソッドの引数にペイロード、秘密鍵、アルゴリズムの種類を指定してエンコードを行います。
RS256と公開鍵(id_rsa.pubファイル)でpyjwtのデコード
RS256と公開鍵(id_rsa.pubファイル)でpyjwtデコードするサンプルコードは、以下のとおりです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
import jwt priv_key_path = "id_rsa" pub_key_path = "id_rsa.pub" payload_data = { "id": "1000", "name": "Sato", "email": "sato@test.com" } with open(priv_key_path) as private_key: encoded_jwt = jwt.encode(payload_data, private_key.read(), algorithm="RS256") print(encoded_jwt) with open(pub_key_path) as public_key: decoded_jwt = jwt.decode(encoded_jwt, public_key.read(), algorithms=["RS256"]) print(decoded_jwt) |
pyjwtのdecodeメソッドの引数にJWTトークン、公開鍵、アルゴリズムの種類を指定してデコードを行います。
デコードの結果、ペイロードデータと同じデータが表示されたらオッケーです。
動作確認
こちらのサイトでAlgorithm欄に「RS256」、Encoded欄に「<JWTトークン>」を指定すると、右側のPAYLOAD DATA欄にペイロードデータが表示されるので、本サイトでも動作確認が可能です。
まとめ
いかがでしたでしょうか。
pyjwtとRS256を使ったエンコードとデコードする方法を紹介してきました。
WEBアプリケーションでも使われるため、ぜひ一度手を動かしてエンコードとデコードできるか試しておくとよいでしょう。
【関連記事】
【TIPS】Pythonのpyjwt(Json Web Token)でエンコード・デコードする方法
【TIPS】Python base64で文字コードのエンコード(符号化)・デコード(復号化)をマスター!