Во-первых, BCrypt (и библиотека, и самоцвет) обрабатывают соль, чтобы вы могли прекратить все солевые дела.
Второе, что вам действительно нужно, - это способ повторного хэширования всех ваших конфиденциальных данных (я полагаю, пароли). Итак, вот что вы делаете:
- Добавить поле к модели, что-то вроде "is_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
предназначено для того, чтобы вы могли знать, какие записи были хэшированы, а какие нет. Это происходит только в том случае, если они действительно сохраняют.
Когда это будет сделано, и вы уверены, что весь код, связанный с паролями, подвергнут рефакторингу, вы можете убрать это поле.