【发布时间】:2011-01-31 03:21:51
【问题描述】:
我正在从使用简单 MD5 无盐密码的旧系统迁移到 Devise。虽然我可以按照Devise wiki 的建议滚动自己的加密器,但我实际上想迁移到 bcrypt 密码机制。
这似乎也比下载彩虹表并试图发现所有明文密码更合理......
所以,我想知道以下代码是否有任何副作用,尤其是在保存时!触发任何具有意外行为的回调:
## config/initializers/legacy.rb
require 'bcrypt'
require 'digest/md5'
module Devise
module Models
module DatabaseAuthenticatable
def valid_password?(password)
if self.legacy_password_hash
if ::Digest::MD5.hexdigest(password) == self.legacy_password_hash
## authenticated; now convert to bcrypt password
self.password = password
self.legacy_password_hash = nil
self.save!
return true
else
## so that we don't get a bcrypt invalid hash exception
return false
end
else
return ::BCrypt::Password.new(self.encrypted_password) == "#{password}#{self.class.pepper}"
end
end
end
end
end
【问题讨论】:
-
试图发现纯文本密码可能是不道德的。 :)
标签: ruby-on-rails devise