【问题标题】:Rails Devise, how to unencrypt a password?Rails Devise,如何解密密码?
【发布时间】:2011-07-30 04:21:11
【问题描述】:

在 Rails 3 设计中,用户记录有一个 encrypted_pa​​ssword 和一个 password_salt。

如何在控制台中获取用户密码?如何解密?

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3 devise


    【解决方案1】:

    Devise 默认使用 BCrypt 算法,AFAIK 无法解密该算法。如果您需要能够解密密码,则需要使用不同的算法,例如AES

    有一个 gem 扩展了对 Devise 的 AES 支持。

    注意:我纯粹出于学术兴趣回答了这个问题。建议您继续使用 BCrypt。我建议您谨慎行事,因为管理密码是有风险的业务。

    【讨论】:

    • 我们应该简单而轻描淡写地强调永远,永远——我再说一遍,永远永远不要解密用户密码!就像您不解密用户的信用卡信息一样。您只需为他们提供一个方法,让他们自己重置它。
    • @Ekampp 当您需要密码与 IMAP 等外部服务进行交互时,您将遇到不解密的问题。当然,解决方案可以使用带有证书的 oath2 身份验证,但这会增加很多开销。有时 AES 身份验证是有意义的。
    【解决方案2】:

    Devise 使用 BCrypt。您需要修改 USERS 表中的 encrypted_pa​​ssword 字段并输入新的加密密码。

    您可以在本网站生成新的加密密码: http://www.bcrypt-generator.com/

    【讨论】:

    • 如果您想要一种简单的方法来验证用户帐户以调试某些东西,这是一个很好的方法!只需记住保存他们的加密密码,以便在完成后重新保存。 :: 我采取的步骤 - u = User.find(:ID) - u.encrypted_pa​​ssword - 在某处存储密码 - u.password = "new_password" - u.save - 调试问题 - u.encrypted_pa​​ssword = :stored_encrypted_pa​​ssword: - u.save
    【解决方案3】:

    我认为这些密码是一种加密方式:您可以获取用户提供的密码,对其进行加密并将其与数据库中的加密密码进行比较(如果匹配 - 成功尝试)。但是无法对数据库中的密码进行解密,因此没有人可以获取所有密码。这是一项安全功能。

    【讨论】:

      【解决方案4】:
      class User < ActiveRecord::Base
      
        devise :database_authenticatable...
      
        def verify_password?(password)
          encryptor_class = Devise::Encryptors.const_get(Devise.encryptor.to_s.classify)
          encryptor_digest = encryptor_class.digest(password, Devise.stretches, self.password_salt, Devise.pepper)
          encryptor_digest == self.encrypted_password
        end
      end
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-10-31
        • 1970-01-01
        • 2012-09-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-04-07
        相关资源
        最近更新 更多