Class: PqcRails::Session::PqcCookieStore
- Inherits:
-
ActionDispatch::Session::CookieStore
- Object
- ActionDispatch::Session::CookieStore
- PqcRails::Session::PqcCookieStore
- Defined in:
- lib/pqc_rails/session/pqc_cookie_store.rb
Overview
ActionDispatch::Session::CookieStoreを継承し、Railsのsecret_key_baseによる AES暗号化(signed_or_encryptedクッキージャー)を使わず、HybridKem(PQC)で セッション内容そのものを暗号化する。
set_cookie/get_cookieはCookieStoreがRailsの暗号化クッキージャーへの委譲点として 用意しているprivateな拡張点(Rails 7.1〜8.1で同一シグネチャ)。ここを上書きして 生のcookie_jar(署名・暗号化なし)に対してEncryptorで暗号化した文字列を直接書き込む。 AEAD(AES-256-GCM)が改竄検知も兼ねるため、Railsの署名は不要。
鍵ローテーション対応: 書き込みは常に現行鍵(@encryptor)のみを使う。読み込みは 現行鍵で失敗した場合、previous_keypairs(鍵ローテーション前の旧鍵)で順に再試行する。 previous_keypairsはDB側のようにprevious:機構で永続する必要はなく、ローテーション後 発行済みの旧セッションCookieが自然に失効するまでの一時的な設定という位置づけ。
Instance Method Summary collapse
-
#initialize(app, options = {}) ⇒ PqcCookieStore
constructor
A new instance of PqcCookieStore.
Constructor Details
#initialize(app, options = {}) ⇒ PqcCookieStore
Returns a new instance of PqcCookieStore.
23 24 25 26 27 28 29 30 |
# File 'lib/pqc_rails/session/pqc_cookie_store.rb', line 23 def initialize(app, = {}) keypair = .delete(:keypair) || KeyManager.keypair previous_keypairs = .delete(:previous_keypairs) || KeyManager.previous_keypairs pq_alg_name = .delete(:pq_alg_name) || Encryptor::DEFAULT_PQ_ALG_NAME @encryptor = Encryptor.new(keypair, pq_alg_name: pq_alg_name) @previous_encryptors = previous_keypairs.map { |kp| Encryptor.new(kp, pq_alg_name: pq_alg_name) } super(app, ) end |