在rails上的ruby中更新数据库字段

时间:2011-12-30 18:52:53

标签: ruby-on-rails ruby database jruby

我正在更新数据库哈希算法。

我目前的系统在 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

我想在模特中写这个。非常感谢任何帮助。 感谢

1 个答案:

答案 0 :(得分:1)

首先,BCrypt(库和宝石)处理盐,这样你就可以解决所有的盐业务。

其次你真正想要的是一种重新散列所有记录敏感数据的方法(我假设的密码)。所以这就是你做的:

  1. 在模型中添加一个字段,例如“is_bcrypt?”和布尔。
  2. 编写并运行:

  3. # 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只是为了让您知道哪些记录已经过哈希处理,哪些记录没有。只有当他们实际存钱时才会发生。

    完成此操作后,您确定所有与密码相关的代码都已重构,您可以取出该字段。