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);
}