我试图让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
令人沮丧,甚至在模型的范围内?我认为我做的事情基本上是不正确的,但是我也跟着其他人做过这样的例子,所以对我错误的任何指导都会非常感激!
答案 0 :(得分:1)
问题是attr_encrypted调用是在类级别,encryption_key方法是实例级别。试着这样做:
class Agreement < ApplicationRecord
attr_encrypted :test_field, key: ENV['super_secret_key']]
end
不可否认,但它应该有效。
真的,私人不会再保护它了。你通过从配置文件中通过env加载它来做到这一点。只要它在您的存储库中没有硬编码,那主要是您需要做的事情。