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

PHP 原始碼加密實作:基於 Base64 與字元置換的混淆方案

     編輯:PHP 相關知識

PHP 原始碼加密實作方案

為了保護 PHP 專案的核心業務邏輯不被直接閱讀,開發者常需對原始碼進行加密混淆。本文介紹一種基於 Base64 編碼與字元置換的輕量級加密方案,並提供完整的加密腳本實作,可生成可直接執行的加密 PHP 檔案。

加密原理解析

  1. 讀取原始碼: 使用 file_get_contents() 獲取目標檔案內容
  2. Base64 編碼: 將原始碼轉為 Base64 字串
  3. 字元置換混淆: 使用兩組隨機生成的密鑰($T_k1、$T_k2)對 Base64 字串進行字元級置換(strtr())
  4. 構建解密執行器: 將密鑰與混淆後的代碼封裝在一個 eval() 結構中,運行時自動解密並執行

完整加密腳本實作

<?php
/**
 * PHP 原始碼加密工具
 * 生成可直接執行的加密 PHP 檔案
 */

// 隨機字串生成器(作為置換密鑰)
function RandAbc($length = "") {
    $str = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
    return str_shuffle($str);
}

// 目標檔案路徑
$filepath = 'index.php';
$path_parts = pathinfo($filepath);
$filename = $path_parts["basename"];

// 生成雙密鑰
$T_k1 = RandAbc(); // 密鑰1
$T_k2 = RandAbc(); // 密鑰2

// 讀取並加密
$vstr = file_get_contents($filename);
$v1 = base64_encode($vstr);
$c = strtr($v1, $T_k1, $T_k2); // 字元置換

// 組裝:密鑰1 + 密鑰2 + 加密內容
$c = $T_k1 . $T_k2 . $c;

// 構建解密執行代碼(經過多層編碼混淆)
$q1 = "O00O0O";
$q2 = "O0O000";
$q3 = "O0OO00";
$q4 = "OO0O00";
$q5 = "OO0000";
$q6 = "O00OO0";

$s = '$' . $q6 . '=urldecode("%6E1%7A%62%2F%6D%615%5C%76%740%6928%2D%70%78%75%71%79%2A6%6C%72%6B%64%679%5F%65%68%63%73%77%6F4%2B%6637%6A");';
$s .= '$' . $q1 . '=$' . $q6 . '{3}.$' . $q6 . '{6}.$' . $q6 . '{33}.$' . $q6 . '{30};';
$s .= '$' . $q3 . '=$' . $q6 . '{33}.$' . $q6 . '{10}.$' . $q6 . '{24}.$' . $q6 . '{10}.$' . $q6 . '{24};';
$s .= '$' . $q4 . '=$' . $q3 . '{0}.$' . $q6 . '{18}.$' . $q6 . '{3}.$' . $q3 . '{0}.$' . $q3 . '{1}.$' . $q6 . '{24};';
$s .= '$' . $q5 . '=$' . $q6 . '{7}.$' . $q6 . '{13};';
$s .= '$' . $q1 . '.=$' . $q6 . '{22}.$' . $q6 . '{36}.$' . $q6 . '{29}.$' . $q6 . '{26}.$' . $q6 . '{30}.$' . $q6 . '{32}.$' . $q6 . '{35}.$' . $q6 . '{26}.$' . $q6 . '{30};';
$s .= 'eval($' . $q1 . '("' . base64_encode('$' . $q2 . '="' . $c . '";eval(\'?>\'.$' . $q1 . '($' . $q3 . '($' . $q4 . '($' . $q2 . ',' . $q5 . '*2),$' . $q4 . '($' . $q2 . ',' . $q5 . ',' . $q5 . '),$' . $q4 . '($' . $q2 . ',0,' . $q5 . '))));') . '"));';

$s = '<?php ' . $s . ' ?>';

// 輸出加密後的檔案
echo $s;

// 寫入檔案
!is_dir('create/') && mkdir('create/');
$fpp1 = fopen('create/' . $filename, 'w');
fwrite($fpp1, $s) or die('寫檔案錯誤');
echo '加密成功!';
?>

生成檔案結構說明

加密後的檔案包含:

  • 一個經過 URL 解碼的字元映射表(urldecode())
  • 多個變數組合還原解密函數名稱(strtr、base64_decode 等)
  • 最終以 eval() 執行解密後的原始碼

解密執行流程

<?php
// 加密檔案執行時的邏輯(簡化版)
$encoded = "雙密鑰 + Base64加密內容"; // 從檔案讀取
$k1 = substr($encoded, 0, 52);        // 提取密鑰1
$k2 = substr($encoded, 52, 52);       // 提取密鑰2
$payload = substr($encoded, 104);     // 提取加密載荷

// 逆向置換
$base64 = strtr($payload, $k2, $k1);
// Base64 解碼
$code = base64_decode($base64);
// 執行原始碼
eval('?>' . $code);
?>

安全性評估與局限

維度評估
防逆向難度低~中等(熟手可通過動態調試獲取解密後代碼)
效能影響每次請求需解密執行,有額外開銷
適用場景簡單授權控制、非核心邏輯保護、學習研究
不適用場景高安全需求、核心演算法、商業授權系統

更強替代方案建議

  • Opcode 加密: 使用 ionCube、Zend Guard、PHPCipher 等商業級加密器,編譯為 Bytecode,無法還原原始碼。
  • C 擴展: 核心邏輯用 C/C++ 撰寫編譯為 .so / .dll 擴展,PHP 呼叫。
  • SGX/TEE: 硬體級可信執行環境,適用極高安全需求。

最佳實踐提醒

  1. 加密前請務必備份原始碼
  2. 加密後徹底測試功能完整性
  3. 生產環境建議配合 Opcode 快取(OPcache)使用
  4. 敏感配置(資料庫密碼、API Key)請勿硬編碼,使用環境變數或配置中心
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved