はじめに
Railsアプリにおいて、ログインパスワードはbcryptを使ってUserモデルにhas_secure_password
と記載すれば簡単に暗号化出来ます。
でも、それ以外にもトークンなどそのまま保管したくない情報が出たときどう処理するんだろう?と疑問が発生。
そこで調べたところ、attr-encryptedという便利なgemがあったので使い方をまとめました。
この記事が役に立つ方
- 暗号化はbcryptの
has_secure_password
しか使ったことがない方
この記事のメリット
-
attr-encrypted
を使って簡単に暗号化が出来るようになる
環境
macOS Catalina 10.15.1
zsh: 5.7.1
Ruby: 2.6.5
Rails: 5.2.4
前提・目的
- 今回暗号化したいデータのカラム名:
hoge
-
既存の
Users
テーブルにhoge
を暗号化して追加したい
インストール方法
gem "attr_encrypted"
bundle install
シンプルです。
使い方
1.マイグレーションファイルを作成
rails g migration AddAttrEncryptedToUsers
2.マイグレーションファイルを編集
class AddAttrEncryptedToUsers < ActiveRecord::Migration[5.2]
def change
add_column :users, :encrypted_hoge, :string
add_column :users, :encrypted_hoge_iv, :string
end
end
encrypted_カラム名
encrypted_カラム名_iv
のように設定します。
3.db:migrate
rails db:migrate
4.Userモデルを編集
class User
attr_encrypted :hoge, key: 'This is a key that is 256 bits!!'
end
attr_encryptes
の後に暗号化したいカラム名を記載します。
5.rails s
rails s
サーバーは再起動しておきます。
これで準備は完了です。
動作確認
rails console
で確認します。
user = User.new
=> #<User:XXXXXXXXXXXXXXXXX id: nil, created_at: nil, updated_at: nil, encrypted_hoge: nil, encrypted_hoge_iv: nil>
↓
user.hoge = "foobar"
=> "foobar"
↓
user
=> #<User:0x000055904fb92870
id: nil,
created_at: nil,
updated_at: nil,
encrypted_hoge: "暗号化された文字列",
encrypted_hoge_iv: "暗号化された文字列">
↓
user.hoge
=> "foobar"
hoge
カラムはUsersテーブル上には存在しませんが、無事に暗号化されていて、呼び出しも出来ることが確認できました
補足:生Rubyでの使用方法もREADMEに記載あり
READMEのUsageにはこんな風に書いてあります。
If you're using an ORM like ActiveRecord, DataMapper, or Sequel, using attr_encrypted is easy:
ActiveRecordとかDataMapperとかSequelみたいなORM(Object-relational mapping)を使うなら簡単に使えるよ!とのこと。
Railsアプリケーションであれば、普通ActiveRecordを使用していると思いますので、今回はこのパターンのみ記載しました。
他にPORO(Plain Old Ruby Object:生Ruby)向けの使い方も掲載されていますので、ご興味のある方はREADMEをご覧ください。
おわりに
最後まで読んで頂きありがとうございました
こんなに簡単に使えると、かえって「ホントに大丈夫なの?」と考えてしまいますが、実際どうなんでしょう?笑
参考にさせて頂いたサイト(いつもありがとうございます)
GitHub - attr-encrypted/attr_encrypted: Generates attr_accessors that encrypt and decrypt attributes