今回「SPA」から「railsサーバー(APIモード)」へpostリクエストをする際のセキュリティを考える機会があり、そこでテキストの暗号化と複合化を行なったのでメモとして記述します。
経緯
今回の経緯としては、「SPA」から「railsサーバー(APIモード)」へpostリクエストをする際にCSRF対策として認証機能をつけようとしたのですが、今回のケースでは通信でクッキー、セッションが使用できませんでした。
そのため簡易的なセキュリティ対策だけでも設定しようということになりました。
そこでテキストの暗号化と複合化に手こずったので方法をメモで残します。
方法
今回の方法は正しい方法かと言われると少し自信がありませんので、使用する際にはご注意ください。
暗号化について
暗号化処理の方法としては、encrypt_and_signという暗号化するメソッドを使用できるようするために、32バイトのキーを生成し、それを元にインスタンス作成を行なっています。
ActiveSupport::KeyGeneratorについては、引数にある「keyword」の中身はどんな値でも問題ありません。理由としては、「ActiveSupport::MessageEncryptor」でインスタンスを作成するためだけに、32バイトのキーが必要になってくるためです。
keyword = "暗号化したいテキスト"
# 32バイトのキーを生成
key = ActiveSupport::KeyGenerator.new( keyword ).generate_key( keyword, 32 )
# インスタンス作成
instance = ActiveSupport::MessageEncryptor.new( key )
# 暗号化
encryption_key = instance.encrypt_and_sign( keyword )
複合化について
最初は暗号化と同じようにインスタンスを作成します。
その後、decrypt_and_verifyで複合化を行います。
keyword = params[:keyword]
# 32バイトのキーを生成
key = ActiveSupport::KeyGenerator.new( keyword ).generate_key( keyword, 32 )
# インスタンス作成
instance = ActiveSupport::MessageEncryptor.new( key )
# トークンの復号化
composite_key = instance.decrypt_and_verify( keyword )
この処理は少し不恰好な処理になっていますが、なんとかテキストの暗号化と複合化ができています。
もっといい方法などがあれば教えていただきたいです。