Rails 7 加密配置未正确设置

我正在尝试将项目从 attr_encrypted 迁移到 Rails 7 加密。我现在正在做的测试只是在开发和测试环境上,所以现在不需要迁移数据。

我所做的步骤是:

  1. 将所有内容从 attr_encrypted 语法更改为 encrypts
  2. 运行 bin/rails db:encryption:init 并将这些值添加到开发和测试凭证 2.1。我还尝试使用 RAILS_ENV=test bin/rails db:encryption:init 并将它们放入测试凭据中,以防不同的数据库需要不同的值

我现在遇到的问题是,每当我运行测试(以干净的数据库开始)时,我都会收到此错误:

ActiveRecord::Encryption::Errors::Configuration:
        key_derivation_salt is not configured. Please configure it via credential active_record_encryption.key_derivation_salt or by setting config.active_record.encryption.key_derivation_salt

虽然如果我进入 Rails 控制台,我会得到以下值:

 Credentials[:active_record_encryption]
=> {:primary_key=>"T..", :deterministic_key=>"k..", :key_derivation_salt=>"6.."}

为了解决这个问题或者至少看看有什么帮助,我在环境 Ruby 文件中添加了这些行:

config.active_record.encryption.key_derivation_salt = Credentials[:active_record_encryption][:key_derivation_salt]
  config.active_record.encryption.primary_key = Credentials[:active_record_encryption][:primary_key]
  config.active_record.encryption.deterministic_key = Credentials[:active_record_encryption][:deterministic_key]

这似乎修复了错误,但是测试失败,因为它似乎将值解密为 nil (测试之前通过了 ofc)

我是否缺少配置步骤?

我认为这些空值来自没有在数据库中更新它们?我该怎么做?

另外,有没有其他方法,所以我不需要将这些行添加到环境文件中?这似乎有点多余。

stack overflow Rails 7 encryption configuration not correctly set
原文答案

答案:

作者头像

就我而言,我想使用初始化程序而不是使用 Rails 凭据从环境变量中读取加密密钥,但我遇到了这个错误。

事实证明,有一个 ActiveRecord 初始化程序运行 before 中的任何内容 config/initializers 读取密钥并保存它们,因此如果您稍后编辑 Rails.application.credentialsRails.application.config.active_record.encryption ,ActiveRecord 看到的密钥将是 nil

这解决了我的问题:

ActiveRecord::Encryption.configure(
  primary_key: ENV["ACTIVE_RECORD_ENCRYPTION_PRIMARY_KEY"],
  deterministic_key: ENV["ACTIVE_RECORD_ENCRYPTION_DETERMINISTIC_KEY"],
  key_derivation_salt: ENV["ACTIVE_RECORD_ENCRYPTION_KEY_DERIVATION_SALT"]
)

我通过阅读代码找到了 ActiveRecord::Encryption.configure ,但它似乎没有在任何地方记录,所以要小心以防它发生变化。

作者头像

您是否通过迁移将最初由 attr_encrypted 提供的属性手动添加到模型中?

由于 gem 将旧值存储在 fieldname_encryptedfieldname_encrypted_iv 中,并且表不包含 fieldname ,因此解密后的值返回为 nil。

就我而言,迁移看起来像这样:

  def change
    add_column :tenants, :smtp_password, :string
    remove_column :tenants, :encrypted_smtp_password, :string
    remove_column :tenants, :encrypted_smtp_password_iv, :string
  end

编辑:您是否将 bin/rails db:encryption:init 的结果存储在凭证文件中环境条目的下方? IE:

development:
  active_record_encryption:
    primary_key: foo
    deterministic_key: bar
    key_derivation_salt: baz
作者头像

我不是专家,但这项工作对我来说只是更新 application.rb

config.active_record.encryption.primary_key = Rails.application.credentials[:active_record_encryption][:primary_key]
config.active_record.encryption.deterministic_key = Rails.application.credentials[:active_record_encryption][:deterministic_key]
config.active_record.encryption.key_derivation_salt = Rails.application.credentials[:active_record_encryption][:key_derivation_salt]
作者头像

首先运行这个命令

bin/rails db:encryption:init

这将生成以下内容

Add this entry to the credentials of the target environment: 

active_record_encryption:
  primary_key: Q3TJUKuOUGSZmgqaD2WZ72pQdg5Rikfn
  deterministic_key: lYew1Q7BE98tDXdqytP3iwvJcu8dYulX
  key_derivation_salt: 9REysw2kZuLybtKjtJsIZHg8cTd2DyMT

application.rb中添加如下配置

config.active_record.encryption.primary_key = ENV['ACTIVE_RECORD_ENCRYPTION_PRIMARY_KEY']
config.active_record.encryption.deterministic_key = ENV['ACTIVE_RECORD_ENCRYPTION_DETERMINISTIC_KEY']
config.active_record.encryption.key_derivation_salt = ENV['ACTIVE_RECORD_ENCRYPTION_KEY_DERIVATION_SALT']

您可以添加此 config/credentials/local.yml.enc

然后您可以通过以下方式进行配置。

config.credentials.content_path = 'config/credentials/local.yml.enc'

或者

config.active_record.encryption.primary_key = Rails.application.credentials[:active_record_encryption][:primary_key]
config.active_record.encryption.deterministic_key = Rails.application.credentials[:active_record_encryption][:deterministic_key]
config.active_record.encryption.key_derivation_salt = Rails.application.credentials[:active_record_encryption][:key_derivation_salt

参考链接: https://guides.rubyonrails.org/active_record_encryption.html

https://www.freshworks.com/eng-blogs/managing-rails-application-secrets-with-encrypted-credentials-blog/

相关问题