我正在更新数据库哈希算法。
我目前的系统在 md5 上运行,我想将其更改为 BCrypt + salt 。
我的问题是当一个旧用户(密码为md5的密码用户)使用旧密码登录时,我想自动将密码更改为数据库中的BCrypt + salt。
if // check if the password stored in bcrypt
salt = IDA::Config.get_configuration('salt')
hash_password = BCrypt::Password.new(hash)
return (BCrypt::Password.create(salt['salt_value']+password) == (salt['salt_value']+password)) ? true : false
else // for users who's password encrypted in md5.
salt = IDA::Config.get_configuration('salt') // i"m getting a salt here
BCrypt::Password.create(salt['salt_value']+password) // Im getting a salted bcryptted password and I tried to put this into db manually and try to login it works perfectly
// I want to write this new salted password into db once the user is authenticated with his old password
return (Digest::MD5.hexdigest(password) == hash) ? true : false
我想在模特中写这个。非常感谢任何帮助。 感谢
答案 0 :(得分:1)
首先,BCrypt(库和宝石)处理盐,这样你就可以解决所有的盐业务。
其次你真正想要的是一种重新散列所有记录敏感数据的方法(我假设的密码)。所以这就是你做的:
# First we need to make sure the bcrypt library is there
require 'bcrypt'
# Gather all of the records
records = YourModel.all
# Go over each of the records
records.each do |record|
# Check to see if the record has a bcrypt'ed password
unless record.is_bcrypt?
# If it doesn't take the value of password, unhash it, rehash it
record.password = BCrypt::Password.create Digest::MD5.hexdigest password
# If it saves correctly, mark the thing as being rehashed
record.is_bcrypt = true if record.save
end
end
有关详细信息,请参阅注释。新字段is_bcrypt
只是为了让您知道哪些记录已经过哈希处理,哪些记录没有。只有当他们实际存钱时才会发生。
完成此操作后,您确定所有与密码相关的代码都已重构,您可以取出该字段。