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

みたいなことにすると良いらしい。今度ちゃんとまとめる