ブログ

読んで思い出す。忘れるために書く

Q. Rails で可逆暗号を使いたい (Rails 6)

A. ActiveSupport::MessageEncryptor を利用する

暗号化・復号化例

#
# ActiveSupport::MessageEncryptor#new で扱える key の長さが
# 決まっているのでその定義を呼び出して使う
#
# salt の生成
#
# NOTE: このままだと実行時に再生成されて復号化できなくなる
# .env や `rails credentials:edit` に値を保管したい
key_length = ActiveSupport::MessageEncryptor.key_len
salt = SecureRandom.random_bytes(key_length)

key =
  ActiveSupport::KeyGenerator.new('additional my secure secret')
                             .generate_key(salt, key_length)


#
# 暗号化・復号化のための MessageEncryptor インスタンスを生成
#
# 暗号化・復号化の実施
#

# HINT: `cipher:` で投げる有効な値は OpenSSL::Cipher.ciphers で確認できる
# デフォルトでは aes-256-gcm が利用される
crypt = ActiveSupport::MessageEncryptor.new(key, cipher: "aes-256-gcm") 

pp encrypted_data = crypt.encrypt_and_sign('my secret data') 
# => "4/fBPw+VUGTXlwsstHfQycJ4hQHUySes--1vnaE91fQM6GZ655--Nyq/mh6ytaxfvMOLYdcySw=="

pp crypt.decrypt_and_verify(encrypted_data)
# => "my secret data"

Links