【发布时间】:2012-05-31 19:04:50
【问题描述】:
当attr_encrypted 调用encryption_key 时,:passphrase 尚未设置。加密密钥最终是盐的 sha1 散列;它应该是密码和盐的 sha1 哈希。
盐在创建时生成并保存在数据库中。
如何在加密密钥中使用:passphrase 虚拟属性?
有什么建议吗?
为简洁起见,我省略了一堆代码。
class Employee < ActiveRecord::Base
require 'digest/sha1'
attr_accessor :passphrase, :ssn
attr_accessible :passphrase, :ssn
attr_encrypted :ssn, :key => proc { |employee| "#{employee.encryption_key}" }
def encryption_key
unless salt?
self.salt = Digest::SHA1.hexdigest(generate_salt)
end
Digest::SHA1.hexdigest([passphrase, self.salt].join)
end
end
class EmployeesController < ApplicationController
def create
@employee = @parent.employees.new(params[:employee])
if @employee.save
redirect_to @parent
else
render action: "new"
end
end
end
提前致谢!
【问题讨论】:
-
我假设
passphrase正在返回到params内的控制器?另外,salt?是在哪里定义的? -
正确:params[:employee][:passphrase]
-
而salt是数据库中的一列。那么,如果盐呢?返回 nil,生成盐。
标签: ruby-on-rails virtual-attribute attr-accessible attr-accessor attr-encrypted