Railsで暗号化するときのメモ的なアレ
背景
ログインに使用するパスワードは不可逆な暗号化を行って、DBに保存にするのは一般的。 それとは別でDBに保存しておきたいんだけど普通に生データとして持つとセキュリティ事故でデータが漏れた場合にそのまま見えてしまう困るようなデータを可逆な暗号化で保存しておきたい。データが漏れないようにセキュリティを強化すると共に、万一データが漏れた場合に容易に流出しないように2重の対策をすることが目的。
ActiveSupport::MessageEncryptor
ActiveSupport::MessageEncryptorを使う。 http://api.rubyonrails.org/classes/ActiveSupport/MessageEncryptor.html
RubyのOpenSSL::Cipherのラッパーだと思う。 https://docs.ruby-lang.org/ja/latest/class/OpenSSL=3a=3aCipher.html
デフォルトの暗号化方式として aes-256-cbc
が使用される。
暗号化方式については詳しくないのでそこの説明はできない。後日ちゃんと学びたい。
サンプルにあるように、以下のように ActiveSupport::KeyGenerator
を使用して暗号化に使用する鍵を生成する
salt = SecureRandom.random_bytes(64) key = ActiveSupport::KeyGenerator.new('password').generate_key(salt, 32) # => "\x89\xE0\x156\xAC..."
ユーザーのデータを暗号化する場合は、saltはユーザーごとに生成して保存しておく。saltは漏れても問題がないデータになる。 パスワードは一意の情報を用意するがこれは漏れてはいけない。環境変数などでアプリ実行時に渡す形にする必要がある。
その後は、その鍵から ActiveSupport::MessageEncryptor
のオブジェクトを生成して暗号化、復号化を行う。
この処理はそれなりに重い処理になる為、頻繁に行うと辛いことになる。
いまの自分にわかってるのはこの程度なのでメモレベル