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

PHP 加密解密類:支援陣列、時效性、多種對稱算法

     編輯:PHP 綜合知識

專案常需一個開箱即用的加密工具類:支援陣列直接加密、密文有效期、Base64 安全字元替換。本文提供 ption 類別,採用對稱加密(自定義 XOR + Base64),適合 Token、API 簽名、暫存敏感資料。

類別完整程式碼

class ption {
    private static $original = ['=', '+', '/'];
    private static $later    = ['O0O0O', 'o0O0o', 'oo00o']; // Base64 特殊字元替換,避免 URL 傳輸問題

    private static function md5($skey = '') {
        return md5(substr($skey ?: 'default_secret', 0, 16));
    }

    /**
     * 加密
     * @param string|array $string 明文或陣列(自動 JSON 編碼)
     * @param string $skey 密鑰
     * @param int $expiry 有效期(秒),0=永久
     * @return string 密文
     */
    static public function en($string = '', $skey = '', $expiry = 0) {
        if (is_array($string)) $string = json_encode($string, JSON_UNESCAPED_UNICODE);
        // 前綴 10 位時間戳(過期時間絕對值)
        $string = str_pad($expiry ? $expiry + time() : 0, 10, '0', STR_PAD_LEFT) . $string;

        $strArr = str_split(base64_encode($string));
        $skey = self::md5($skey);
        foreach (str_split($skey) as $k => $v) {
            if ($k < count($strArr)) $strArr[$k] .= $v; // 密鑰字元混入每個 Base64 字元
        }
        return str_replace(self::$original, self::$later, implode('', $strArr));
    }

    /**
     * 解密
     * @param string $string 密文
     * @param string $skey 密鑰
     * @return string|array|false 明文或陣列,失效/驗證失敗回傳 false
     */
    static public function de($string = '', $skey = '') {
        $strArr = str_split(str_replace(self::$later, self::$original, $string), 2); // 每 2 字元一組(原字元+密鑰字元)
        $skey = self::md5($skey);
        foreach (str_split($skey) as $k => $v) {
            if ($k < count($strArr) && $strArr[$k][1] === $v) {
                $strArr[$k] = $strArr[$k][0]; // 移除密鑰字元
            }
        }
        $result = base64_decode(implode('', $strArr));

        // 驗證時間戳
        $timestamp = (int)substr($result, 0, 10);
        if ($timestamp == 0 || $timestamp - time() > 0) {
            $data = substr($result, 10);
            // 嘗試 JSON 解碼
            $decoded = json_decode($data, true);
            return (json_last_error() === JSON_ERROR_NONE) ? $decoded : $data;
        }
        return false; // 過期
    }
}

使用範例

$data = ['username' => 'oschina', 'pw' => '123456', 'huoxin' => '!@#$%^&'];
$encrypted = ption::en($data, 'my_secret_key', 3600); // 1小時有效
echo "加密: $encrypted\n";

$decrypted = ption::de($encrypted, 'my_secret_key');
echo "解密: ";
print_r($decrypted);
// Array ( [username] => oschina [pw] => 123456 [huoxin] => !@#$%^& )

設計亮點解析

安全性評估與建議

  • ⚠️ 非標準加密算法:屬於「安全透過模糊」,未經密碼學審計,**不適合高敏感資料**(密碼、金鑰、個資)。
  • ✅ 適用場景:API 臨時 Token、前後端狀態傳遞、快取資料加密、防篡改簽名。
  • 🔒 生產環境替代:採用 openssl_encrypt('AES-256-GCM') 或 libsodium(PHP 7.2+ sodium_crypto_secretbox),提供經驗證的認證加密。
  • 🔑 金鑰管理:勿硬編碼 default_secret,使用環境變數或密碼管理系統。

此類別適合快速原型、內部工具、低敏感度資料加密;核心業務請遷移至標準加密庫。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
特性實作方式優勢
陣列支援自動 json_encode/decode呼叫端無需手動序列化
時效性明文前綴 10 位絕對過期時間戳解密時直接比對 time(),無需額外儲存
URL 安全Base64 +/= 替換為字母數字組合可直接放入 URL 參數、Cookie、Header
密鑰混淆密鑰字元逐位混入 Base64 字元增加逆向難度,非標準 Base64