前後端分離架構下,有時需在 PHP 端加密敏感數據,前端 JavaScript 解密展示(如 Token、配置參數)。本文展示兩種方案:Base64+XOR 混淆與簡易位運算混淆,**注意:此類客戶端可逆加密僅適合非極敏感數據混淆,無法替代 HTTPS 與真正的加密傳輸。**
<?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@#$)()*&*&*');
?>
<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>
<?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、算法公開、極易逆向 | 極低價值數據混淆、教學演示 |
SubtleCrypto 支援 AES-GCM、RSA-OAEP,配合 PHP openssl_encrypt 實現真正端到端加密。window.crypto.subtle.encrypt 配合 IndexedDB,金鑰由後端派發並定期輪換。理解這些「偽加密」方案的原理與局限,有助於在技術選型時做出正確決策:**前端可逆邏輯永遠不可信,真正的安全必須建立在傳輸層加密與服務端授權之上。**