【问题标题】:Rails 7 encryption configuration not correctly setRails 7 加密配置未正确设置
【发布时间】:2022-11-09 21:36:54
【问题描述】:

我正在尝试将项目从 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)

    我是否缺少配置步骤?

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

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

【问题讨论】:

  • 你有没有找到解决这个问题的方法?我遇到了同样的问题。
  • 不幸的是我没有

标签: ruby-on-rails ruby encryption ruby-on-rails-7


【解决方案1】:

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

原来有一个 ActiveRecord 初始化程序在运行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,但它似乎没有在任何地方记录,所以要小心以防它发生变化。

【讨论】:

    【解决方案2】:

    您是否通过迁移将最初由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
    

    【讨论】:

    • 是的,我做了同样的事情,删除了encrypted_fieldencrypted_field_iv,并添加了field,但不幸的是问题仍然存在
    【解决方案3】:

    我不是专家,但这项工作对我来说只是更新 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]
    

    【讨论】:

    • 我最终确实在每个环境文件中添加了config.active_record.encryption = Credentials[:active_record_encryption]。我认为在application.rb 中添加这些可能同样有效
    • @VictorMotogna 如果你只是做Rails.application.credentials[Rails.env.to_sym][:active_record_encryption][:primary_key],你可以在 application.rb 文件中拥有它
    【解决方案4】:

    首先运行这个命令

    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
    

    在里面添加如下配置应用程序.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']
    

    你可以添加这个配置/凭据/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/

    【讨论】:

      猜你喜欢
      • 2014-11-10
      • 1970-01-01
      • 2013-10-18
      • 1970-01-01
      • 1970-01-01
      • 2013-02-28
      • 1970-01-01
      • 1970-01-01
      • 2020-11-30
      相关资源
      最近更新 更多