🤕

Rails 7.0 から 7.1 で ActiveReco­rd::​Encryption::​Errors::​Decryption

2024/02/02に公開

Rails 7.0 から 7.1 にアップグレードする際に、Active Record暗号化アルゴリズムの問題でエラーに遭遇しました。

class Patient
  encrypts :mynumber

みたいなので

https://railsguides.jp/upgrading_ruby_on_rails.html#active-record-暗号化アルゴリズムの変更について

に従って、バージョンアップ前の config.active_support.key_generator_hash_digest_class と同じになるよう config.active_record.encryption.hash_digest_class = OpenSSL::Digest::SHA256 を設定したのですが、

irb(main):001> irb(main):001> Patient.first
/src/vendor/bundle/ruby/3.3.0/gems/activerecord-7.1.3/lib/active_record/encryption/encryptor.rb:58:in `rescue in decrypt': ActiveRecord::Encryption::Errors::Decryption (ActiveRecord::Encryption::Errors::Decryption)

のようにエラーが発生して読みだせなくなりました。

ドキュメントに併せて記載のある config.active_record.encryption.support_sha1_for_non_deterministic_encryption = true を設定することで解消しました。

config/initializers/encryption.rb
# https://railsguides.jp/upgrading_ruby_on_rails.html#active-record-%E6%9A%97%E5%8F%B7%E5%8C%96%E3%82%A2%E3%83%AB%E3%82%B4%E3%83%AA%E3%82%BA%E3%83%A0%E3%81%AE%E5%A4%89%E6%9B%B4%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6
# Rails 7.0 デフォルトの暗号化方式に設定
Rails.application.config.active_support.key_generator_hash_digest_class = OpenSSL::Digest::SHA256
Rails.application.config.active_record.encryption.hash_digest_class = OpenSSL::Digest::SHA256
# Rails 7.0 で SHA1 で暗号化されていたバグによる影響を受けたデータを復号するために必要
Rails.application.config.active_record.encryption.support_sha1_for_non_deterministic_encryption = true
irb(main):001> Patient.first
=> 
#<Patient:0x00007f01fee1b6d8

このconfig.active_record.encryption.support_sha1_for_non_deterministic_encryption設定は、Rails 7.1ではデフォルトで無効になっています。Rails 7.1より前のバージョンで、暗号化データが上記のバグの影響を受けている可能性がある場合は、この設定を有効にする必要があります。

タケユー・ウェブ株式会社

Discussion