【发布时间】: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