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

PHP 加密與 JavaScript 解密:跨語言數據加密傳輸實作

     編輯:PHP 綜合知識

跨語言對稱加密:PHP 加密、JS 解密的兩種實作方案

前後端分離架構下,有時需在 PHP 端加密敏感數據,前端 JavaScript 解密展示(如 Token、配置參數)。本文展示兩種方案:Base64+XOR 混淆與簡易位運算混淆,**注意:此類客戶端可逆加密僅適合非極敏感數據混淆,無法替代 HTTPS 與真正的加密傳輸。**

方案一:Base64 編碼 + MD5 Key XOR 加密

PHP 加密端

<?php
function strencode($string) {
    // 1. Base64 編碼原始字串
    $string = base64_encode($string);

    // 2. 產生固定 Key(這裡用 MD5('123456'),實際應用請用環境變數管理)
    $key = md5('123456');
    $len = strlen($key);
    $code = '';

    // 3. 逐字元 XOR 混淆
    for ($i = 0; $i < strlen($string); $i++) {
        $k = $i % $len;
        $code .= $string[$i] ^ $key[$k];
    }

    // 4. 再次 Base64 輸出,確保可安全傳輸
    return base64_encode($code);
}

// 測試
echo strencode('abced你好我是你們定的點點滴滴asd@#$)()*&*&*');
?>

JavaScript 解密端

<script>
// 需引入 Base64 與 MD5 庫(如 crypto-js)
function strdecode(string) {
    var key = CryptoJS.MD5('123456').toString(); // 計算相同 Key
    var bytes = CryptoJS.enc.Base64.parse(string); // Base64 解碼
    var str = CryptoJS.enc.Latin1.stringify(bytes); // 轉為 Latin1 字串以便逐字元處理

    var code = '';
    for (var i = 0; i < str.length; i++) {
        var k = i % key.length;
        code += String.fromCharCode(str.charCodeAt(i) ^ key.charCodeAt(k));
    }

    // 二次 Base64 解碼還原原文
    var decoded = CryptoJS.enc.Base64.parse(code);
    return CryptoJS.enc.Utf8.stringify(decoded);
}

// 測試(對應 PHP 輸出)
alert(strdecode('PGZ6Cz40Z1JCWCYNRVtSDwsvfVsIexpcEFN0DU0OSQkXQUIPCQxnV1NLDA9SSw8PF1JhWxAHZ18FAGIncUFiFS5yWxAuClxUf15fXA=='));
</script>

方案二:簡易位運算混淆(無 Key 版)

PHP 端:加密並內嵌 JS 解密器

<?php
if (!function_exists('jm')) {
    function jm($str) {
        $len = strlen($str);
        $res = '';
        for ($i = 0; $i < $len; $i++) {
            $ascc = ord($str[$i]);
            if ($ascc < 128) { // 僅處理 ASCII 字元
                $ascc = $ascc ^ 7; // 固定 XOR 7
            }
            $res .= chr($ascc);
        }
        return $res;
    }
}

// 輸出包含解密邏輯的 JS 代碼
echo "<script>
xflag = true;
function xcount(xh) {
    if (!xflag) return;
    var xc = '', xd = [], xe = '', xf = 0;
    for (i = 0; i < xh.length; i++) {
        xa = xh.charCodeAt(i);
        if (xa < 128) xa = xa ^ 7; // 同樣 XOR 7 還原
        xe += String.fromCharCode(xa);
        if (xe.length > 80) { xd[xf++] = xe; xe = ''; }
    }
    xc = xd.join('') + xe;
    document.write(xc);
}
</script>";

// 加密要輸出的 JS 代碼片段
$check_count = addslashes(jm("<script>alert('測試咯~~~');</script>"));
$check_count = "<SCRIPT LANGUAGE=\"JavaScript\">xcount(\"$check_count\");</SCRIPT>";
echo $check_count;
echo "<!-- count ended -->";
?>

安全性分析與最佳實踐

方案優點缺點適用場景
Base64+XOR+MD5 Key Key 可配置、雙層 Base64 便於傳輸 Key 硬編碼在 JS 中,極易破解;XOR 非加密標準 非敏感配置混淆、防止誤觸、簡單防刷
固定 XOR 7 極簡、無外部依賴 無 Key、算法公開、極易逆向 極低價值數據混淆、教學演示

現代替代方案建議

  1. HTTPS + 簽名驗證:敏感數據走 HTTPS,簽名防篡改(JWT、HMAC-SHA256)。
  2. Web Crypto API:瀏覽器原生 SubtleCrypto 支援 AES-GCM、RSA-OAEP,配合 PHP openssl_encrypt 實現真正端到端加密。
  3. 後端渲染/SSR:敏感數據直接在服務端模板渲染,避免前端解密邏輯洩露。
  4. 加密存儲:若需前端暫存,使用 window.crypto.subtle.encrypt 配合 IndexedDB,金鑰由後端派發並定期輪換。

理解這些「偽加密」方案的原理與局限,有助於在技術選型時做出正確決策:**前端可逆邏輯永遠不可信,真正的安全必須建立在傳輸層加密與服務端授權之上。**

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