2017年10月17日
railsでdeviseとか使わずにパスワードを暗号化みたいなことをしたくて、 has_secure_password
を使っていたけど、今回使うパスワードはRailsアプリでの認証ではなくて、Railsアプリから登録したパスワードを使ってなんかやるスクリプトで参照したい、という要件があった。したがってパスワードを平文で扱う事が必要になるので、これだと非可逆である。
パスワードとしては強固なのは分かるが今回の要件に合わないのでActiveSupportを使う。
crypt = ActiveSupport::MessageEncryptor.new(SECURE, CIPHER)
とやると暗号化と復号化ができるオブジェクトを定義できるので
module PasswordCryptModule extend ActiveSupport::Concern ENCRYPT_CIPHER = 'aes-256-cbc' SECURE = 'なんかながい文字列' key_len = ActiveSupport::MessageEncryptor.key_len(ENCRYPT_CIPHER) salt = Rails.application.config.action_dispatch.encrypted_cookie_salt KEY = ActiveSupport::KeyGenerator.new(SECURE).generate_key(salt, key_len) class_methods do def encrypt(password) crypt = ActiveSupport::MessageEncryptor.new(KEY, digest: 'SHA256', chipher: ENCRYPT_CIPHER, serializer: Marshal) crypt.encrypt_and_sign(password) end def decrypt(password) crypt = ActiveSupport::MessageEncryptor.new(KEY, digest: 'SHA256', cchipher: ENCRYPT_CIPHER, serializer: Marshal) crypt.decrypt_and_verify(password) end end end
みたいなことにすると良いらしい。今度ちゃんとまとめる