2017-06-14 22 views
1

我已经在现有问题中寻找答案,但在Rails中找不到任何涵盖此散列方案的内容。Rails中的特定md5散列方案

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

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

创建密码的MD5哈希值。 创建盐的MD5哈希。 用salt_hash连接password_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 

任何想法?

+1

一件事携手迈向是尽可能快地杀死MD5密码。请记住,当有人登录并验证其密码正确时,您有机会使用相同的散列(例如bcrypt)版本更新其用户记录,无需骚扰用户更改其密码。 – tadman

+0

为了帮助解决问题的人们,可以举例说明如何保存“测试”或“示例”等密码,以便其他人可以验证您的代码是否正常工作? – tadman

+0

谢谢,这个想法是,一旦他们通过身份验证并登录后,MD5哈希将从数据库中删除,密码将在bcrypt中进行散列处理等。 我将检查最终哈希结果是“测试”还是“例如“在PHP应用程序中,并尽快用答案更新这个问题。 只需要添加一下,我需要在这里定位的“盐”在legacy_salt的数据库中有一个字段名称,而不是“salt”。我需要在某个地方定义它,因为它不是MD5摘要使用的默认“salt”吗? – bearmettle

回答

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 
+0

这可以扩展为识别新的格式散列,如'“$ 2a $ 10 $ ....”'并且使用Bcrypt处理它。 – tadman