【发布时间】:2016-12-23 08:15:26
【问题描述】:
我们正在将我们的网站从旧的 PHP 框架转换为 Rails,并且非常希望用户能够继续使用旧密码登录。在旧站点上,我们使用 password_hash 和 password_verify 来散列和验证密码。但是,在 Rails 上,我似乎无法验证旧密码。
这是我们在 PHP 中所拥有的:
哈希:
password_hash($user['salt'] . $password . $user['salt'], PASSWORD_DEFAULT);
验证:
password_verify($user['salt'] . $password . $user['salt'], $user['password'])
在新的 Rails 框架上,我们使用 Devise 并构建了一个自定义迁移脚本来移动所有内容并根据存储在数据库中的 password_version 识别正确的密码哈希方法,这就是我在我的内部使用的用户模型:
def valid_password?(password)
if password_version == 'legacy'
hash = BCrypt::Password.new(encrypted_password)
hash_str = password_salt+password+password_salt
return hash.is_password? hash_str
end
super(password)
end
任何想法将不胜感激
【问题讨论】:
-
password_verify 不是很复杂。传入新的密码和原始密码哈希。将 crypt 方法 + salt 从散列中提取出来,使用它们重新散列新的密码,然后比较生成的散列值。
-
@Script47 是的,它应该在那里。
-
@MarcB 是的,这基本上就是我想要做的。根据我的理解,它应该使用 bcrypt,所以 rails 部分应该可以工作,我会想到
-
password_hash应该可以在不需要盐的情况下工作。添加一个只会把事情搞砸。你为什么这样做? -
Please don't add your own salt to password_hash。让它自己添加。您将获得存储在哈希中的盐
标签: php ruby-on-rails ruby