无法解密 cookie

Unable to decrypt cookie

我需要加密我网站上的 cookie。为简单起见,假设我要加密的数据是我的会话 ID。

这里是我如何生成我的 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;
}

您正在使用 OPENSSL_RAW_DATA - 此调用的输出不是十六进制,而是二进制。将原始二进制文件存储在 cookie 中是不行的!您可能更喜欢 base64 而不是 hex,这是默认行为。