2021年4月2日金曜日

Ruby で jwt を使ってみた

Ruby で jwt を使ってみた

概要

jwt (JSON Web Token) は JSON の情報をあるアルゴリズムで暗号化し送受信する仕組みです
トークンの送信するだけなので比較的に簡単に使えます
認証などに使われたりします
今回は Ruby で jwt を使ってトークンの生成や復号化を行ってみました

環境

  • Ruby 3.0.0
    • jwt 2.0.10

インストール

  • bundle init
  • vim Gemfile
gem "jwt"
  • bundle install

Secret パスワードを使って暗号化/復号化

パスワードを使って暗号化と復号化を行います
送信側と受信側で同じでシークレットを共有する必要があります
使用できるアルゴリズムは「HS256」「HS512256」「HS384」「HS512」になります
RbNaCl を使うと更に暗号化の種類を増やせます

  • vim test.rb
require "jwt"

payload = {
  "data" => "test"
}
hmac_secret = 'my$ecretK3y'
alg = "HS512"

token = JWT.encode payload, hmac_secret, alg
puts token

decoded_token = JWT.decode token, hmac_secret, true, { algorithm: alg }
puts decoded_token

公開鍵認証 (RSA) を使って暗号化/復号化

公開鍵を使って暗号化と復号化を行います
暗号化する側で秘密鍵を使い復号化する側で公開鍵を使います
使用できるアルゴリズムは「RS256」「RS384」「RS512」になります

  • openssl genrsa > priv.key
  • openssl rsa -pubout < priv.key > pub.key
  • vim test.rb
require "jwt"
require "openssl"

payload = {
  "data" => "test"
}
OpenSSL::PKey::RSA.new 2048
pri_key = OpenSSL::PKey::RSA.new File.read("./priv.key")
pub_key = pri_key.public_key
alg = "RS512"

token = JWT.encode payload, pri_key, alg
puts token

decoded_token = JWT.decode token, pub_key, true, { algorithm: alg }
puts decoded_token

最後に

他にもいろいろな暗号化方式を使ったトークンの生成方法があります
シークレットの共有方式よりも鍵を使った方式のほうがセキュアな気はします

参考サイト

0 件のコメント:

コメントを投稿