Rails

attr_encryptedを利用してカラムの暗号化・復号化を行う

記載内容の修正について(2017/9/21)

DBにssnカラムを作成することによって可読性の低下やattr_encryptedの設定漏れによって平文のままデータが格納されてても気づきにくい問題を引き起こす可能性があるため、DBにssnカラムを作成しない手順に修正しました。

参考

Github: attr_encrypted

準備

Gemfile

Gemfile
gem "attr_encrypted", "~> 3.0.0"
$ bundle install

DB設計

README通り、暗号化するカラム名はssnとします。
【修正】REAEME通り、暗号化したssnを格納するカラムを用意します。

Usersテーブル

カラム名 備考
name string
ssn string 暗号化したいカラム【修正】ssnカラムは作成しない
encrypted_ssn string 暗号化されたデータが格納されるカラム
encrypted_ssn_iv string 初期化ベクトルが格納されるカラム

Scaffold

Usersモデルにname,ssn,encrypted_ssn:string,encrypted_ssn_ivカラムを作成します。
【追記】ssnについてはscaffoldでフォームなどを自動生成させる目的で指定してます。

$ rails g scaffold user name:string ssn:string encrypted_ssn:string encrypted_ssn_iv:string

Migration

【修正】DBにssnカラムが作成されないようにt.string :ssnをコメントアウトします。
【補足】コメントアウトしない場合、DBにssnカラムが作成されますがattr_encryptedが正常に動作すればssnカラムに値は登録されず、空のカラムになります。

db/migrate/YYYYMMDDhhmmss_create_users.rb
class CreateUsers < ActiveRecord::Migration[5.1]
  def change
    create_table :users do |t|
      t.string :name
      # t.string :ssn DBにssnカラムが作成されないようにコメントアウトする
      t.string :encrypted_ssn
      t.string :encrypted_ssn_iv

      t.timestamps
    end
  end
end

Migration

$ rake db:migrate

Model

【追記】ssnアクセサを追加します。
User.ssnに値を指定した状態でsaveすることで,encrypted_ssn,encrypted_ssn_ivカラムに暗号化したデータが登録されます。また、User.ssnを参照することで復号化されたデータを取得することができるようになります。

app/models/user.rb
class User < ApplicationRecord
  attr_encrypted :ssn, key: 'This is a key that is 256 bits!!'
end

データの登録

ssnカラムに暗号化させたい値を入力して登録します。

attr_encrypted1.png

データの取得

ssnカラムに登録した値が表示されてるが、DBのssnカラムは空なので、正常に暗号化・復号化されてることがわかります。
【修正】encrypted_ssn:string,encrypted_ssn_ivに暗号化したデータが登録されてることがわかります。
DBにssnカラムは存在しませんが、画面上には暗号化前と同じデータが表示されてるため、復号化も正常に行われたことがわかります。

attr_encrypted_5.png

attr_encrypted_6.png