代码之家  ›  专栏  ›  技术社区  ›  PeterWong

Rails设计gem中的密码加密问题

  •  2
  • PeterWong  · 技术社区  · 14 年前

    我现在改为使用Gem designe进行用户身份验证。但我不知道如何匹配加密!

    我知道我们可以编写一个新的加密程序并在初始化器中分配它,但关键是加密程序只接受4个参数(password、streams、salt、pepper)。但在我的例子中,我确实在加密中包含了用户的电子邮件和定制的salt。

    2 回复  |  直到 14 年前
        1
  •  9
  •   PeterWong    14 年前

    不过,我想我已经找到了答案,尽管它没有我想象的那么漂亮。

    首先,在初始化器中创建加密类:

    module Devise
      module Encryptors
        class MySha1 < Base
          def self.digest(password, salt)
            Digest::SHA1.hexdigest("#{salt}-----#{password}")
          end
    
          def self.salt(email)
            Digest::SHA1.hexdigest("#{Time.now}-----#{email}")
          end
        end
      end
    end
    

    其次,覆盖用户模型中的一些方法:

    # overwrite this method so that we call the encryptor class properly
    def encrypt_password
      unless @password.blank?
        self.password_salt = self.class.encryptor_class.salt(email)
        self.encrypted_password = self.class.encryptor_class.digest(@password, self.password_salt)
      end
    end
    
    # Because when the database_authenticatable wrote the following method to regenerate the password, which in turn passed incorrect params to the encrypt_password, these overwrite is needed!
    def password=(password)
      @password = password
    end
    def password_digest(pwd)
      self.class.encryptor_class.digest(pwd, self.password_salt)
    end
    

    最后,我们要教你什么时候加密密码:

    before_save :encrypt_password
    
        2
  •  0
  •   jasongregori    12 年前

    我不确定这有多古老,但这似乎是一个更好的方法: http://presentations.royvandewater.com/authentication-with-devise.html#9