【问题标题】:Specific md5 hashing scheme in RailsRails 中特定的 md5 哈希方案
【发布时间】:2017-11-17 03:46:50
【问题描述】:

我已经在一个现有问题中寻找答案,但没有找到涵盖 Rails 中这种散列方案的任何内容。

我目前正在将一个 PHP 项目迁移到我仍在学习的 Ruby-on-Rails。我正在努力移植用于散列用户密码的 MD5(我知道,这只是临时的......)散列方案。我有普通的 MD5 工作,但找不到我需要的散列方案的正确语法。

PHP 项目中散列方案的机制是:

创建密码的 MD5 哈希值。 创建盐的 MD5 哈希。 将 password_hash 与 salt_hash 连接起来。 创建 concatenated_string 的 MD5 哈希。 比较 stored_hash 和 concatenated_string

用于创建哈希的 PHP 是:

function fn_generate_salted_password($password, $salt)
{
    $_pass = '';

    if (empty($salt)) {
        $_pass = md5($password);
    } else {
        $_pass = md5(md5($password) . md5($salt));
    }

    return $_pass;
}

到目前为止,我在 Rails 中对这一部分所做的(可悲的)尝试是:

Spree::User.class_eval do
  def valid_password?(password)
    if self.salt.present
      if ::Digest::MD5.hexdigest((::Digest::MD5.hexdigest(password)).(::Digest::MD5.hexdigest(salt))) == self.stored_hash
        *# Do some stuff*
      else
        false
      end
    end
  end
end

有什么想法吗?

【问题讨论】:

  • 要努力争取尽快消除 MD5 密码。请记住,当有人登录并且您验证他们的密码正确时,您有机会使用正确散列(例如 bcrypt)版本的相同版本更新他们的用户记录,无需骚扰用户更改他们的密码。
  • 为了帮助人们解决您的问题,您能否举例说明如何保存“testing”或“example”之类的密码,以便其他人可以验证您的代码是否正常工作?
  • 谢谢,我们的想法是,一旦他们通过身份验证并登录,MD5 散列将从数据库中删除,密码在 bcrypt 等中进行散列。我将检查最终散列结果的用途PHP 应用程序中的“测试”和“示例”,并尽快用答案更新这个问题。补充一下,我需要在这里定位的“盐”在 legacy_salt 的数据库中会有一个字段名称,而不是“盐”。我是否需要在某个地方定义它,因为它不是 MD5 的摘要使用的默认“盐”?
  • 如果做得正确,并且我在这里非常宽松地使用该术语,因为这种散列样式在 1990 年代初期已经过时,那么盐将是存储在单独字段中的一些随机值。
  • 谢谢塔德曼。另一种方法是批量密码重置邮件,我希望避免这种情况。

标签: ruby-on-rails ruby authentication hash md5


【解决方案1】:

我会这样做:

def valid_password?(password)
  secret = if salt.present?
             [password, salt].map { |part| ::Digest::MD5.hexdigest(part) }.join
           else
             password
           end

 stored_hash == ::Digest::MD5.hexdigest(secret)
end

【讨论】:

  • 这可以扩展以识别像"$2a$10$...." 这样的新格式哈希并使用 Bcrypt 处理它。
猜你喜欢
  • 2012-08-17
  • 2021-10-19
  • 1970-01-01
  • 1970-01-01
  • 2020-12-08
  • 2018-07-14
  • 2019-04-24
  • 2011-06-18
相关资源
最近更新 更多