未正确设置Rails 7加密配置

xxe27gdn  于 2022-10-15  发布在  Ruby
关注(0)|答案(3)|浏览(160)

我正在尝试将一个项目从attr_encrypted迁移到rails 7加密。我现在正在进行的测试只是在开发和测试环境上进行的,所以现在不需要迁移数据。
我所做的步骤是:
1.将所有语法从attr_encrypted更改为encrypts
1.运行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)
我是否错过了一个配置步骤?
我认为这些空值来自于没有在数据库中更新它们?我该怎么做呢?
另外,有没有其他方法可以让我不需要将这些行添加到环境文件中?这看起来有点多余。

am46iovg

am46iovg1#

在我的例子中,我希望使用初始化器从环境变量中读取加密密钥,而不是使用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,但似乎没有任何地方记录它,所以要小心,以防它发生变化。

rdrgkggo

rdrgkggo2#

您是否通过迁移手动将最初由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的结果存储在凭据文件中的环境条目下?即:

development:
  active_record_encryption:
    primary_key: foo
    deterministic_key: bar
    key_derivation_salt: baz
pftdvrlh

pftdvrlh3#

我不是Maven,但这项工作对我来说只需更新应用程序即可。

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]

相关问题