active_record_encryptionというgemを使う
誰でも簡単3ステップで導入
①gemを導入
Gemfileに以下を追記
gem 'active_record_encryption'
bundle install
②カラムを設定
blob型でカラムを設定します。例えばユーザーの本名、生年月日を暗号化するならこんな感じ
class DeviseCreateUsers < ActiveRecord::Migration[6.0]
def change
create_table :users do |t|
## Database authenticatable
t.string :email, null: false, default: ""
t.string :encrypted_password, null: false, default: ""
t.string :uid, null: false
t.string :nickname, null: false
t.blob :first_name, null: false
t.blob :last_name, null: false
t.blob :first_name_kana, null: false
t.blob :last_name_kana, null: false
t.blob :birth_date, null: false
t.references :organization, foreign_key: true
③モデルに暗号化したカラムの元データを定義
モデルに以下のように記載します。
encrypted_attribute(:first_name, :string, default: "")
encrypted_attribute(:last_name, :string, default: "")
encrypted_attribute(:first_name_kana, :string, default: "")
encrypted_attribute(:last_name_kana, :string, default: "")
encrypted_attribute(:birth_date, :date)
④暗号化方式を定義
config/initializers/active_record_encryption.rbに以下のように記述します。
暗号化key、saltについては知られちゃまずいので環境変数で設定します。
ActiveRecordEncryption.default_encryption = {
encryptor: :active_support,
key: ENV['ENCRYPTION_KEY'],
salt: ENV['ENCRYPTION_SALT']
}
⑤DBにデータを保存する
この状態でDBにデータを保存するとこんな感じの値が入ります。
見た目はなんのこっちゃわからないのですが、値を取り出すとちゃんと保存時に指定した値が取り出せます。
[2] pry(main)> user.first_name
=> "山田"
感想
結構簡単に実装できてしまうのでセキュリティ的にどうなの?って感じもする。
SQLインジェクションとかで値を抜き取られたときとかに強そう