アプリケーションがアクセスするのは暗号化されていないデータですが,データベースには暗号化されたデータが保存されます.
もし機密情報が漏れたとしても,暗号化しておくことで流出した情報を解読することは困難です.
オブジェクトがDBに暗号化されず保存されている時,万が一個人を特定できるデータが流出すると大変です.
そのために暗号化が標準ライブラリとして用意されています.
RailsでActiveRecordを使って暗号化するにあたり,よく使いそうなものをまとめました.
利用方法
セットアップ
$ bin/rails db:encryption:init
出力:
active_record_encryption:
primary_key: <生成されたキー>
deterministic_key: <生成されたキー>
key_derivation_salt: <生成されたキー>
application.rb
class Application < Rails::Application
config.active_record.encryption.primary_key = ENV['PRIMARY_KEY']
config.active_record.encryption.deterministic_key = ENV['DETERMINISTIC_KEY']
config.active_record.encryption.key_derivation_salt = ENV['KEY_DERIVATION_SALT']
end
暗号化
暗号化したい属性に対して,モデルレベルで定義します.
このライブラリは,属性をDBへ保存する前に暗号化し,取得時に複号化します.
データの暗号化
model
class Article < ApplicationRecord
encrypts :title
end
暗号化データのクエリ検索
※findメソッドを使用しない場合は非推奨
model
encrypts :email, deterministic: true
小文字に揃える
model
encrypts :email, downcase: true
文字の大小の区別を失わず,クエリでのみ区別しない
※ただし,ignore_case
を追加する場合は,original_<カラム名>
というカラムを個別に作成する必要有
model
encrypts :name, deterministic: true, ignore_case: true
以前の暗号化スキームを属性ごとに設定する
model
encrypts :title, deterministic: true, previous: { deterministic: false }
一意性(非決定的暗号化)
同じクエリから異なる暗号文を生成する.
model
encrypts :title, deterministic: { fixed: false }
決定論的暗号化と非決定的暗号化
暗号化 | 特徴 |
---|---|
非決定論的暗号化 | 常に最新(現在)の暗号化スキームによって暗号化される |
決定論的暗号化 | 常にデフォルトで最も古い暗号化スキームによって暗号化される |
※決定論的暗号化では,同じクエリを通すと常に同じ暗号文になる.
注意事項
暗号化では十分な容量が必要です.UTF-8を利用しているDBのカラムは,バイト数で見ると、そのサイズの4倍まで容量が増加する可能性があります
例:
暗号化するコンテンツ | 元のカラムサイズ | 暗号化カラムの推奨サイズ | ストレージのオーバーヘッド(最大) |
---|---|---|---|
メールアドレス | string(255) | string(510) | 255 bytes |
絵文字の短いシーケンス | string(255) | string(1020) | 255 bytes |
非西洋アルファベットのサマリーテキスト | string(500) | string(2000) | 255 bytes |
任意の巨大テキスト | text | text | 無視可能 |
参考