Как расшифровать подписанные куки - PullRequest
0 голосов
/ 21 января 2020

Я пытаюсь расшифровать подписанного повара ie, но не смог добиться успеха.

То, как я использую подписанный повар ie в моем контроллере сеансов, как это

class SessionsController < ApplicationController
  def new
  end

  def create
    user = User.find_by_email(params[:email])
    if user && user.authenticate(params[:password])
      if params[:remember_me]
        cookies.signed[:auth_token] = { value: user.auth_token, expires: 2.weeks.from_now }
      else
        cookies.signed[:auth_token] = user.auth_token
      end
      redirect_to root_url, notice: "Logged in!"
    else
      flash.now.alert = "Email or password is invalid"
      render :new
    end
  end

  def destroy
    cookies.delete(:auth_token)
    redirect_to root_url, notice: 'Logged Out'
  end
end

Сейчас на стороне контроллера приложения, я пытаюсь расшифровать его

require 'cgi'
require 'active_support'
class ApplicationController < ActionController::Base
  protect_from_forgery


  def current_user
    @current_user ||= User.find_by(auth_token: verify_and_decrypt)
  end

  def verify_and_decrypt
    config = Rails.application.config
    cookie = CGI::unescape(cookies[:auth_token])
    salt   = config.action_dispatch.authenticated_encrypted_cookie_salt
    encrypted_cookie_cipher = config.action_dispatch.encrypted_cookie_cipher || 'aes-256-gcm'
    serializer = ActiveSupport::MessageEncryptor::NullSerializer


    key_generator = ActiveSupport::KeyGenerator.new(Rails.application.secret_key_base, iterations: 1000)
    key_len = ActiveSupport::MessageEncryptor.key_len(encrypted_cookie_cipher)

    secret = key_generator.generate_key(salt, key_len)
    encryptor = ActiveSupport::MessageEncryptor.new(secret, cipher: encrypted_cookie_cipher, serializer: serializer)

    cookie = encryptor.decrypt_and_verify(cookie)
    cookie
  end
end

Но каждый раз, когда это терпит неудачу в этой строке, готовьте cook ie = encryptor.decrypt_and_verify (cook ie)

ActiveSupport::MessageEncryptor::InvalidMessage: ActiveSupport::MessageEncryptor::InvalidMessage
from /home/anikettiwari/.rvm/gems/ruby-2.5.3/gems/activesupport-5.2.4.1/lib/active_support/message_encryptor.rb:190:in `_decrypt'

Может кто-нибудь сказать мне, что я делаю неправильно

Для ссылок я проверил эту ссылку

1 Ответ

1 голос
/ 21 января 2020

Вы можете просто прочитать cook ie через стандартный интерфейс rails: value = cookies.signed[:auth_token]

Что касается того, почему ваш расшифровщик не работает - вы генерируете новую соль шифрования, но для расшифровки нужно использовать ту же соль, которая был использован в процессе шифрования.

Также имейте в виду, что подписанные куки-файлы не шифруются полностью - они только защищают от взлома, но могут быть прочитаны пользователем

...