【问题标题】:Virtual attribute is not set before attr_encrypted uses said virtual attribute for encryption key在 attr_encrypted 使用所述虚拟属性作为加密密钥之前未设置虚拟属性
【发布时间】: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


【解决方案1】:

尝试在密码和其他属性之后设置 ssn

class EmployeesController < ApplicationController
  def create
    ssn = params[:employee].delete(:ssn)
    @employee = @parent.employees.new(params[:employee])
    @employee.ssn = ssn
    if @employee.save
        redirect_to @parent
    else
        render action: "new"
    end
  end
end

【讨论】:

  • 完美。有没有办法:在模型中的 ssn 之前设置密码,或者延迟 attr_encrypted 直到设置属性?
  • @pdjk 我相信如果您将 params[:employee] 转换为有序哈希并确保 :passphrase 出现在 :ssn 之前,那么它应该可以工作
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多