🤕
Rails 7.0 から 7.1 で ActiveRecord::Encryption::Errors::Decryption
Rails 7.0 から 7.1 にアップグレードする際に、Active Record暗号化アルゴリズムの問題でエラーに遭遇しました。
class Patient
encrypts :mynumber
みたいなので
に従って、バージョンアップ前の 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