在 Web 開發中,參數傳遞時為了安全性常需進行加密解密。PHP 內建的 mcrypt_encrypt 和 mcrypt_decrypt 提供了對稱加密功能,但加密後的字串可能包含特殊字符(如 +、/、=),直接用於 URL 會造成解析錯誤。本文示範如何結合 Base64 編碼與自定義字符替換,實現 URL 安全的加密解密流程。
$key = "miyao"; // 密鑰
$string = "jiami"; // 待加密字串
// 1. 使用 MCRYPT_RIJNDAEL_256 (AES-256) 進行 CBC 模式加密
// 密鑰衍生:md5($key) 作為金鑰,md5(md5($key)) 作為 IV
$crypttext = base64_encode(
mcrypt_encrypt(
MCRYPT_RIJNDAEL_256,
md5($key),
$string,
MCRYPT_MODE_CBC,
md5(md5($key))
)
);
// 2. 處理特殊字符,使其 URL 安全
$encrypted = trim(safe_b64encode($crypttext));
// -----------------------------------------------------------
// 解密流程
// -----------------------------------------------------------
// 1. 還原特殊字符
$crypttexttb = safe_b64decode($encrypted);
// 2. Base64 解碼後進行解密,並移除填充的空字節
$decryptedtb = rtrim(
mcrypt_decrypt(
MCRYPT_RIJNDAEL_256,
md5($key),
base64_decode($crypttexttb),
MCRYPT_MODE_CBC,
md5(md5($key))
),
"\0"
);
標準 Base64 編碼會產生 +、/、= 三個在 URL 中有特殊含義的字符,需替換為安全字符:
/**
* URL 安全的 Base64 編碼
* 將 + / = 替換為 - _ (空字串)
*/
public function safe_b64encode($string) {
$data = base64_encode($string);
$data = str_replace(['+', '/', '='], ['-', '_', ''], $data);
return $data;
}
/**
* URL 安全的 Base64 解碼
* 還原 - _ 為 + /,並補齊 = 至 4 的倍數長度
*/
public function safe_b64decode($string) {
$data = str_replace(['-', '_'], ['+', '/'], $string);
$mod4 = strlen($data) % 4;
if ($mod4) {
$data .= substr('====', $mod4);
}
return base64_decode($data);
}
openssl_encrypt/openssl_decrypt 或 sodium 擴展(PHP 7.2+ 內建)。更多 PHP 相關內容可參考本站專題:《PHP 加密方法總結》、《PHP 運算與運算符用法總結》、《PHP 網絡編程技巧總結》、《PHP 基本語法入門教程》、《PHP 面向對象程序設計入門教程》、《PHP 字符串用法總結》、《PHP+MySQL 數據庫操作入門教程》及《PHP 常見數據庫操作技巧匯總》。