Techioz Blog

Ruby on Rails で既存のデータを暗号化するにはどうすればよいですか?

概要

データベースのいくつかのテーブルのいくつかのフィールドを暗号化したいと考えています。 encrypts :‘field_name’ をモデルクラスに追加すると、既にデータベースに追加されているデータは暗号化されません。これを行う移行を作成する必要があると思います。どのようなメソッドまたは Rails モジュールを使用すればよいですか? Railsガイドの暗号化では見つかりませんでした。 ありがとう。

Rails ガイドやドキュメントを読もうとしましたが、役に立ちませんでした。

解決策

モデルのデータベース テーブルに新しい列を追加し、その新しい列を暗号化するようにモデルを構成します。

# in a migration
add_column :model_name, :attribute_name_new, :string

# in the model
encrypts :attribute_name_new

それが設定されたら、レガシー列から新しい暗号化された列にデータをコピーします。

# in a Rake task or simply in the Rails console:
ModelName.find_each do |record|
  record.update(attribute_name_new: record.attribute_name)
end

そして最後のステップとして、古い列を削除し、新しい列の名前を元の属性名に変更します。

# in a migration
remove_column :model_name, :attribute_name
rename_column :model_name, :attribute_name_new, :attribute_name

データベース テーブルのサイズに応じて、また、これらの手順の実行中に短時間のダウンタイムが発生しても問題ない場合は、両方の列の同期を長期間維持するためにモデルへの追加の変更が必要かどうかが異なります。