LoginSignup
2
0

Rails 暗号化まとめ

Last updated at Posted at 2024-03-05

アプリケーションがアクセスするのは暗号化されていないデータですが,データベースには暗号化されたデータが保存されます.
もし機密情報が漏れたとしても,暗号化しておくことで流出した情報を解読することは困難です.

オブジェクトが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 無視可能

参考

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0