无法解密cookie

问题描述 投票:0回答:1

我需要加密我网站上的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;
}
php encryption cookies php-openssl
1个回答
1
投票

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

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.