使用最基本的设置:
class User < ActiveRecord::Base
attr_encrypted :name,
key: 'This is a key that is 256 bits!!',
encode: true,
encode_iv: true,
encode_salt: true
end
Run Code Online (Sandbox Code Playgroud)
提供相同名称时,结果在数据库中显示如下:
?????????????????????????????????????????????????????????
? id ? encrypted_name ? encrypted_name_iv ?
?????????????????????????????????????????????????????????
? 1 ? aVXZb1b317nroumXVBdV9pGxA2o= ? JyE7wHups+3upY5e ?
? 2 ? aVXZb1b317nroumXVBdV9pGxA2o= ? uz/ktrtbUAksg5Vp ?
?????????????????????????????????????????????????????????
Run Code Online (Sandbox Code Playgroud)
为什么密文相同?这不是iv的一部分,宝石默认使用它吗?
我们已将应用程序升级到 Rails 7,现在我们遇到了 attr_encrypted gem 的问题。当我们尝试启动 Rails 服务器/控制台时,我们收到以下错误:
gems/ruby-3.0.2/gems/attr_encrypted-3.1.0/lib/attr_encrypted.rb:176:in `block in attr_encrypted': undefined method `[]=' for nil:NilClass (NoMethodError)
Run Code Online (Sandbox Code Playgroud)
如果我们恢复到 Rails 6,错误就会消失,有人遇到过同样的问题吗?
我使用attr_encrypted加密我的一些模型字段,并使用Tire和Elasticsearch进行全文搜索.我只使用一个简单的搜索表单.这是我的模型的一部分:
class Student < ActiveRecord::Base
include Tire::Model::Search
include Tire::Model::Callbacks
attr_accessible :name, :surname
attr_encrypted :name, :key => 'f98gd9regre9gr9gre9gerh'
attr_encrypted :surname, :key => 'f98gd9regre9gr9gre9gerh'
def self.search(params)
tire.search(load: true) do
query { string Student.encrypt_name(params[:search]) } if params[:search].present?
end
end
end
Run Code Online (Sandbox Code Playgroud)
因此,例如,如果我在数据库中有名称"John",当我搜索"John"时,查询被加密(Student.encrypt_name(params [:search])),然后查询数据库,结果返回.Elasticsearch允许通配符搜索,例如,如果我搜索"Joh*",则应返回匹配结果,但加密关键字"Joh"与加密"John"不同,db不返回任何结果.任何解决方案都将受到赞赏.
此致,拉多斯拉夫
ruby-on-rails elasticsearch ruby-on-rails-3.2 attr-encrypted
我想测试一个使用attr_encrypted加密数据库中的秘密的模型
class Thing
attr_encrypted :secret, encode: true
end
Run Code Online (Sandbox Code Playgroud)
但是当我在灯具中定义秘密时,编码的换行符会被转义出来.
one:
encrypted_secret: '<%= Thing.encrypt_secret(SecureRandom.uuid) %>'
Run Code Online (Sandbox Code Playgroud)
那是:
'axZFZEknxUSYdUlPhwLBbj8CwSeCW5at2INA98EcCcY7MVFdmXvk7Sb4DZhC\nm6qD\n'
Run Code Online (Sandbox Code Playgroud)
存储在数据库中:
'axZFZEknxUSYdUlPhwLBbj8CwSeCW5at2INA98EcCcY7MVFdmXvk7Sb4DZhC
m6qD'
Run Code Online (Sandbox Code Playgroud)
这样做的问题是失败了:
thing = things(:one)
assert_equal thing, Thing.find_by_secret(thing.secret)
Run Code Online (Sandbox Code Playgroud)
Thing.find_by_secret(thing.secret)返回nil,因为生成的SQL查询尝试匹配加密机密的两个版本并且无法获得匹配.
我试过了:
one:
encrypted_secret: 'axZFZEknxUSYdUlPhwLBbj8CwSeCW5at2INA98EcCcY7MVFdmXvk7Sb4DZhC\nm6qD\n'
Run Code Online (Sandbox Code Playgroud)
但得到相同的结果.
如何配置我的灯具以使用attr_encrypted?
我在rails应用程序上有一个ruby,我正在使用attr_encrypted
gem来加密一些用户信息.它有盐和IV,所以它是双向加密的.宝石拦截动态find_by
以协助查询,但这对我的情况来说不是一个充分的查询,因为我关心结果的数量.
有没有办法查询表以返回与给定匹配的所有结果secret
?
这是一个例子.我有一个users
表,它有一个加密secret
属性.因此encrypted_secret
,这个表有encrypted_secret_iv
,和encrypted_secret_salt
.如果用户给出了"abd123"的秘密,我如何查询该表以查看有多少其他人也使用"abc123"作为他们的秘密?
目前,我的数据库已加密数据,我发送给Algolia.我需要搜索这个加密数据但是如果索引是'John'并且我搜索'Joh',它们根本不相似,因此导致0次点击.
任何想法如何解决这个问题?我目前正在运行rails和attr_encrypted