Hi有以下型号:
class User < ActiveRecord::Base
secret_key = ENV['DB_COL_ENCRYPTED_KEY']
attr_encrypted :email, :key => secret_key
attr_encrypted :password, :key => secret_key
[...]
end
我在型号中添加了4列
rails g migration AddEncryptedColumnsToUser encrypted_email:string encrypted_password:string encrypted_email_iv:string encrypted_password_iv:string
现在我想检查电子邮件和密码是否正确,但我不知道如何处理:
secret_key_data = "my big secret 32 bits key "
email = User.encrypt_email("test@test.com", key: secret_key_data)
password = User.encrypt_password("test", key: secret_key_data)
User.where('(encrypted_email) LIKE ? AND (encrypted_password) LIKE ? ', email,password)
但当我这样做时:
email = User.encrypt_email("test@test.com", key: secret_key_data)
我得到了这个错误:
ArgumentError: must specify an iv
问题是,我从哪里获得iv,如果登录正确,我如何加密才能在数据库中测试
非常感谢!
一些旧版本的attr_encrypted具有古怪(或没有(的初始向量(iv(处理。请注意您正在使用的attr_encrypted的版本。我认为这是你的问题。使用Rails v4.1.16尝试attr_encrypted v3.1.0。
在您的迁移中:
class CreateUsers < ActiveRecord::Migration
def change
create_table :users do |t|
t.string :username, null: false
t.string :encrypted_email
t.string :encrypted_email_iv
t.string :encrypted_password
t.string :encrypted_password_iv
t.timestamps
end
end
end
在您的模型中:
class User < ActiveRecord::Base
attr_encrypted :email, :password,
key: 'Some 256-bit key here'
end
在您的控制器中:
private
# Never trust parameters from the scary internet, only allow the white list through.
def server_params
params.require(:server).permit(:username, :email, :password)
end
这个版本/配置适合我。