Обновить поле базы данных в ruby ​​на рельсах - PullRequest
2 голосов
/ 30 декабря 2011

Я обновляю алгоритм хеширования базы данных.

Моя текущая система работает на 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 Ответ

1 голос
/ 30 декабря 2011

Во-первых, BCrypt (и библиотека, и самоцвет) обрабатывают соль, чтобы вы могли прекратить все солевые дела.

Второе, что вам действительно нужно, - это способ повторного хэширования всех ваших конфиденциальных данных (я полагаю, пароли). Итак, вот что вы делаете:

  1. Добавить поле к модели, что-то вроде "is_bcrypt?" и логическое значение.
  2. Напишите и запустите это:

# 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 предназначено для того, чтобы вы могли знать, какие записи были хэшированы, а какие нет. Это происходит только в том случае, если они действительно сохраняют.

Когда это будет сделано, и вы уверены, что весь код, связанный с паролями, подвергнут рефакторингу, вы можете убрать это поле.

...