0

我试图在attr_encrypted将某些数据保存到数据库之前对其进行模糊处理。我需要稍后处理记录器的输出,但目前我只想从提交的表单中获取字段数据,加密并保存。

这是我的模型:

class Agreement < ApplicationRecord
  attr_encrypted :test_field, key: :encryption_key

  private

  def encryption_key
      ENV['super_secret_key']
  end
end

我注意到,当我注释掉private一切似乎都按预期工作。但我显然不想让公众访问该信息(你知道:超级密钥),所以我希望它是私有的。但是,当我包含时,private我得到一个错误。具体来说:NoMethodError (undefined method 'bytesize' for :encryption_key:Symbol)。我深入研究的attr_encrypted是抛出错误,因为它没有将密钥传递给它,因为私有方法没有被正确访问。

理论上,attr_encrypted我可以只设置key: ENV['super_secret_key']而不是调用方法,但这里的目标是实际创建一个具有相应数据库表的新类,我可以通过它保存、存储和旋转我的密钥,而这些密钥又被混淆了通过环境变量获得额外的安全层。

所以我真正的问题是:我的私有方法发生了什么,为什么private令人沮丧的事情,即使在模型的范围内?我认为我做的事情基本上是不正确的,但我也遵循了其他人的例子,所以任何关于我的错误的指导将不胜感激!

4

1 回答 1

1

问题是 attr_encrypted 调用是在类级别,encryption_key 方法是实例级别。尝试这样做:

class Agreement < ApplicationRecord
  attr_encrypted :test_field, key: ENV['super_secret_key']]
end

诚然未经测试,但它应该工作。

真的,虽然私人不会再保护它了。您通过 env 从配置文件加载它是正确的。只要它没有在您的存储库中硬编码,这主要是您需要做的。

于 2016-09-02T17:25:10.297 回答