Невозможно расшифровать cookie - PullRequest
0 голосов
/ 14 сентября 2018

Мне нужно зашифровать куки на моем сайте.Предположим, что данные, которые я хотел зашифровать, для простоты являются моим идентификатором сессии.

Вот как я могу сгенерировать свой cookie, зашифровать его с помощью PHP openSSL и расшифровать его.

/**
 * Encrypt any cookie
 * @param $content
 * @param $key_name
 * @param $iv_name
 * @return string
 */
function encrypt_cookie(string $content, string $key_name, string $iv_name): string
{
    $method = 'AES-256-CFB';
    $ivLength = openssl_cipher_iv_length($method);
    $needStrong = true;
    $keyLength = 256;
    if (!isset($_SESSION[$key_name]))  {
        $key = openssl_random_pseudo_bytes($keyLength, $needStrong);
        $_SESSION[$key_name] = $key;
    } else {
        $key = $_SESSION[$key_name];
    }
    $iv = openssl_random_pseudo_bytes($ivLength, $needStrong);
    $_SESSION[$iv_name] = $iv;

    return openssl_encrypt($content, $method, $key, $options=OPENSSL_RAW_DATA, $iv);
}

/**
 * Decrypt any cookie
 * @param string $cookie_name
 * @param string $key_name
 * @param $iv_name
 * @return string
 */
function decrypt_cookie(string $cookie_name, string $key_name, $iv_name): string
{
    $data = $_COOKIE[$cookie_name];
    $method = 'AES-256-CFB';
    $key = $_SESSION[$key_name];
    $options = OPENSSL_RAW_DATA;
    $iv = $_SESSION[$iv_name];

    return openssl_decrypt($data, $method, $key, $options, $iv);
}

/**
 * Create the cookie and set its value to an
 * encrypted version of my session ID
 */
function cooking_snickerdoodles(): void
{
    $cookie_name = "sugar_cookie";
    $content = session_id();
    $key_name = 'timeout_cookie_key';
    $iv_name = 'sugar_cookie_iv';

    $hex = encrypt_cookie($content, $key_name, $iv_name);
    setcookie($cookie_name, $hex);
}

Шифрование прекрасно работает.Он выводит что-то, и я могу прочитать это, если я конвертирую, используя bin2hex().Однако мой метод расшифровки не работает вообще.Я проверил в своем инструменте разработчика браузера, и «sugar_cookie» отображается как один из файлов cookie.

Когда я пытаюсь вывести результат decrypt_cookie(), я ничего не получаю, даже если я передаю его в bin2hex.

Этот следующий код не очень важен, но я использую его, чтобы убедиться, что данные сеанса соответствуют данным cookie:

function has_the_cookie($cookie_name): bool
{
    if (isset($_COOKIE[$cookie_name])) {
        return true;
    } else {
        return false;
    }
}

function cookie_tastes_right(): bool
{
    $crumbs = $_COOKIE['sugar_cookie'];
    $whole_cookie = decrypt_cookie($crumbs, $_SESSION['timeout_cookie_key'], $_SESSION['sugar_cookie_iv']);
    if ($whole_cookie === session_id()) {
        return true;
    } else {
        return false;
    }
}

function confirm_cookie_in_bag(): void
{
    if (!has_the_cookie('sugar_cookie') || !cookie_tastes_right()) {
        end_session();
        redirect_to(url_for('admin/login.php'));
    }
}

РЕДАКТИРОВАТЬ - ПОКАЗАТЬ ОБНОВЛЕННЫЕ ФУНКЦИИкоторые не хранят двоичные файлы

/**
 * Encrypt any cookie
 * @param $content
 * @param $key_name
 * @param $iv_name
 * @return string
 */
function encrypt_cookie(string $content, string $key_name, string $iv_name): string
{
    $method = 'AES-256-CFB';
    $ivLength = openssl_cipher_iv_length($method);
    $needStrong = true;
    $keyLength = 256;
    if (!isset($_SESSION[$key_name]))  {
        $key = openssl_random_pseudo_bytes($keyLength, $needStrong);
        $_SESSION[$key_name] = $key;
    } else {
        $key = $_SESSION[$key_name];
    }
    $iv = openssl_random_pseudo_bytes($ivLength, $needStrong);
    $_SESSION[$iv_name] = $iv;

   return bin2hex(openssl_encrypt($content, $method, $key, $options=OPENSSL_RAW_DATA, $iv));

}

/**
 * Decrypt any cookie
 * @param string $cookie_name
 * @param string $key_name
 * @param $iv_name
 * @return string
 */
function decrypt_cookie(string $cookie_name, string $key_name, $iv_name): string
{
    $data = hex2bin($_COOKIE[$cookie_name]);
    $method = 'AES-256-CFB';
    $key = $_SESSION[$key_name];
    $options = OPENSSL_RAW_DATA;
    $iv = $_SESSION[$iv_name];

    //ECHO and exit for demo purposes only
    echo bin2hex(openssl_decrypt($data, $method, $key, $options, $iv));
    exit;
}

1 Ответ

0 голосов
/ 14 сентября 2018

Вы используете OPENSSL_RAW_DATA - вывод этого вызова не будет шестнадцатеричным, он будет двоичным. Хранение необработанных двоичных файлов в cookie-файлах не требуется! Вы, вероятно, предпочтете base64 вместо hex, что является поведением по умолчанию.

...