首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

PHP 使用 mcrypt 實現字串加密解密與 URL 安全編碼

     編輯:PHP 綜合知識

前言

在 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"
);

URL 安全編碼輔助函數

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

完整可執行範例

注意事項與現代替代方案

  • mcrypt 擴展已棄用:PHP 7.1 起棄用,PHP 7.2 起移除。新專案建議使用 openssl_encrypt/openssl_decrypt 或 sodium 擴展(PHP 7.2+ 內建)。
  • 金鑰衍生:範例中直接使用 MD5 衍生金鑰與 IV,生產環境建議使用 PBKDF2、HKDF 等標準金鑰衍生函數。
  • IV 管理:CBC 模式下 IV 應為隨機生成並與密文一起儲存,而非固定衍生。
  • 填充模式:mcrypt 使用零填充,openssl 預設使用 PKCS#7,互操作時需注意。

相關線上工具

延伸閱讀

更多 PHP 相關內容可參考本站專題:《PHP 加密方法總結》、《PHP 運算與運算符用法總結》、《PHP 網絡編程技巧總結》、《PHP 基本語法入門教程》、《PHP 面向對象程序設計入門教程》、《PHP 字符串用法總結》、《PHP+MySQL 數據庫操作入門教程》及《PHP 常見數據庫操作技巧匯總》。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved