OpenSSL数据加密,加密数据作为url传参,结果获取加密数据时,数据null

使用 OpenSSL 进行加密(例如采用 AES-256-CBC 模式)后得到的原始加密数据(即二进制数据)可能包含任何字节值,而 Base64 编码的结果仅限于特定的字符集(A-Z, a-z, 0-9, +, / 和 =),问题就出在+/=上。

+ 在 URL 中表示空格
/ 用于分隔 URL 的不同部分
= 通常用于查询字符串参数的值分隔,但在某些上下文中可能会引起问题

为了在 URL 中安全地传输 Base64 编码的数据,你需要对编码后的字符串进行 URL 安全的编码。

将 + 替换为 -(连字符)
将 / 替换为 _(下划线)
去除末尾的 =(填充字符)

示例

// 传参加密
function encrypt($data) {
    $data = json_encode($data);
    $key = "";
    $method = "AES-256-CBC";
    $ivlen = openssl_cipher_iv_length($method);
    $iv = openssl_random_pseudo_bytes($ivlen);
    $encrypted = openssl_encrypt($data, $method, $key, OPENSSL_RAW_DATA, $iv);
    $encrypted = base64_encode($iv . $encrypted);
    $encrypted = strtr($encrypted, '+/', '-_');
    return $encrypted;
}

// 传参解密函数
function decrypt($data) {
    $key = "";
    $method = "AES-256-CBC";

    $data = strtr($data, '-_', '+/');
    $padding = strlen($data) % 4;
    if ($padding) {
        $data .= str_repeat('=', 4 - $padding);
    }
    $data = base64_decode($data);
    $ivlen = openssl_cipher_iv_length($method);
    $iv = substr($data, 0, $ivlen);
    $encrypted = substr($data, $ivlen);
    $decrypted = openssl_decrypt($encrypted, $method, $key, OPENSSL_RAW_DATA, $iv);
    return json_decode($decrypted, true);
}