Railsで簡単可逆暗号(ActiveSupport::MessageEncryptor)

  • 123
    Like
  • 0
    Comment
More than 1 year has passed since last update.

Railsで簡単に可逆暗号をする方法

とりあえずrails cで試す。

$ rails c

プレーンテキスト(message)、鍵(secret)を以下のようにする。

message = 'Qiitaきーたキータ'
secret = SecureRandom::hex(128)
# => "b67f94a18fe7a18682d99bb78db61d9cf867d6bf09d4fa93785bdaabf61834a88e2621b296c042a72bd6da913cfaa1c0ea5f5efb978bc7118d9174f18cfca091656fb3e1d2553cfe6d5e7626a2c914ab4e82feb46c4704655dff76cf6629cb9e76e841a0fa099c687ac02fd49622c7604d2d7acd386ff4caff70a566dbea541a"

encryptorの宣言(AES-256, Cipher Block Chainingで暗号化)

encryptor = ::ActiveSupport::MessageEncryptor.new(secret, cipher: 'aes-256-cbc')

暗号化(encrypt_and_sign)

encrypt_message = encryptor.encrypt_and_sign(message)
# => M3daVDM1ZmlSSFV6d2doSW84U1pPRUpCWnZ3aWROdy92REJoc3lvbVlVUEdkNHdRayt2c3hLeTlWREFoR0hWVy0teW92TzAwWEVPbE5sRzZJTW5RQ3AwUT09--28a03ca3ae1530c57f8a07a72d2ea13fe68aff4e

シグネチャ付きなのに注意。

復号化(decrypt_and_verify)

encryptor.decrypt_and_verify(encrypt_message)
# => "Qiitaきーたキータ"

※シグネチャが不正な場合はActiveSupport::MessageVerifier::InvalidSignatureがraiseされる

encryptor.decrypt_and_verify(encrypt_message + 'a')
# ActiveSupport::MessageVerifier::InvalidSignature: ActiveSupport::MessageVerifier::InvalidSignature

なお、別プラットフォームとの交換をする場合は、シグネチャ部分を実装するか、シグネチャなし(encrypt_and_signではなく、encrypt)にする

https://github.com/rails/rails/blob/f3e1b21ca91afbd97f33d1e51808dd320d82b4de/activesupport/lib/active_support/message_verifier.rb#L41

使用可能な暗号化方式の調べ方

$ openssl list-cipher-commands

異なるプラットフォームの場合は、OpenSSLのバージョンに注意すること。