对php7.4 项目使用php-beast加密源码全流程
PHP-Beast 加密项目完整流程笔记
(适用于 指定目录加密,非全项目加密)
📌 一、准备工作
1. 安装 php-beast
# 1. 下载源码
git clone https://github.com/liexusong/php-beast.git /root/php-beast-master
# 2. 编译安装
cd /root/php-beast-master
phpize && ./configure --with-php-config=/www/server/php/74/bin/php-config
make && make install
# 3. 启用扩展
echo "extension=beast.so" > /www/server/php/74/etc/php.d/beast.ini
systemctl restart php-fpm-74
# 4. 检查安装情况,使用下面命令查看拓展信息
[root@i ~]# php -i | grep beast
beast
beast V2.7 support => enabled
beast.cache_size => 10485760 => 10485760
beast.enable => 1 => 1
beast.log_file => /var/log/php-beast.log => /var/log/php-beast.log
beast.log_level => debug => debug
beast.log_normal_file => 0 => 0
beast.log_user => www => www
beast.networkcard => eth0 => eth0
# 5. 如果上面php.d没有被加载,就直接在php.ini在配置
; 启用 php-beast 扩展
extension=beast.so
; 配置缓存大小(单位:字节,例如 10MB = 10485760)
beast.cache_size = 10485760
; 日志文件路径(需确保目录可写)
beast.log_file = "/var/log/php-beast.log"
; 日志记录用户(默认:运行 PHP 的用户,如 www-data 或 nginx)
beast.log_user = "www"
; 日志级别(可选:debug, info, warning, error)
beast.log_level = "debug"
; 是否启用 php-beast(On/Off)
beast.enable = On
# 6. 重启phpfpm再检查
2. 生成加密密钥
mkdir -p /etc/php-beast
openssl rand -hex 32 > /etc/php-beast/key
chmod 600 /etc/php-beast/key
以下是两种加密方案的详细操作指南,根据你的需求选择适合的方式:
📌 加密方案1:使用 encode_files.php 批量加密项目
步骤1:修改 configure.ini 文件
进入 php-beast 的 tools 目录,编辑 configure.ini:
cd /root/php-beast-master/tools
vim configure.ini
修改内容如下(根据实际需求调整):
; 要加密的项目路径(绝对路径)
src_path = "/www/wwwroot/server.cc/public"
; 加密后文件输出路径(可与 src_path 相同,直接覆盖原文件)
dst_path = "/www/wwwroot/server.cc/public_encrypted"
; 过期时间(留空表示永不过期)
expire = "2025-12-31 23:59:59"
; 加密算法(DES、AES 或 BASE64)
encrypt_type = "AES"
步骤2:执行加密
运行以下命令开始加密:
php encode_files.php
- 输出示例:
Start encode files... Encrypt file: /www/wwwroot/server.cc/public/index.php [OK] Encrypt file: /www/wwwroot/server.cc/public/config.php [OK] ... Encode complete.
步骤3:验证加密文件
检查加密后的文件内容:
head -n 3 /www/wwwroot/server.cc/public_encrypted/index.php
- 加密后的文件开头会包含类似标记:
<?php // @beast 加密后的乱码 ?>
📌 加密方案2:使用 beast_encode_file() 函数单文件加密
步骤1:编写 PHP 加密脚本
创建一个脚本(如 encrypt.php):
<?php
// 要加密的文件
$input_file = '/www/wwwroot/server.cc/public/index.php';
// 加密后输出路径
$output_file = '/www/wwwroot/server.cc/public/index_encrypted.php';
// 过期时间戳(如:2025-12-31 23:59:59)
$expire_timestamp = strtotime('2025-12-31 23:59:59');
// 加密算法(BEAST_ENCRYPT_TYPE_AES 或 BEAST_ENCRYPT_TYPE_DES)
$encrypt_type = BEAST_ENCRYPT_TYPE_AES;
// 执行加密
if (beast_encode_file($input_file, $output_file, $expire_timestamp, $encrypt_type)) {
echo "加密成功: $output_file\n";
} else {
echo "加密失败\n";
}
?>
步骤2:运行脚本
php encrypt.php
- 输出示例:
加密成功: /www/wwwroot/server.cc/public/index_encrypted.php
步骤3:验证加密文件
cat /www/wwwroot/server.cc/public/index_encrypted.php
🔍 两种方案对比
| 特性 | 方案1(encode_files.php) | 方案2(beast_encode_file) |
|---|---|---|
| 适用场景 | 批量加密整个项目 | 单文件或动态加密 |
| 配置方式 | 修改 configure.ini 文件 |
编写 PHP 脚本调用函数 |
| 过期时间设置 | 支持(格式:YYYY-mm-dd HH:ii:ss) |
支持(需传入时间戳) |
| 加密算法 | DES、AES、BASE64 | DES、AES |
| 输出路径灵活性 | 需固定输出目录 | 可自由指定输出路径 |
⚠️ 注意事项
-
备份源码
加密前务必备份原始文件:cp -r /www/wwwroot/server.cc/public /www/wwwroot/server.cc/public_backup -
密钥安全
确保/etc/php-beast/key文件权限为600:chmod 600 /etc/php-beast/key -
测试加密文件
加密后务必在测试环境验证功能是否正常:php -f /www/wwwroot/server.cc/public_encrypted/index.php -
Web 服务器配置
如果加密后文件放在新目录(如public_encrypted),需修改 Nginx/Apache 配置指向新路径。
💡 常见问题解决
Q1:加密后文件无法执行
- 原因:PHP 未加载
beast.so扩展。 - 解决:
php -m | grep beast # 检查扩展是否加载 echo "extension=beast.so" >> /www/server/php/74/etc/php.ini # 确保扩展启用 systemctl restart php-fpm
Q2:beast_encode_file() 函数未定义
- 原因:PHP 未链接到 php-beast 扩展。
- 解决:
// 在脚本开头检查函数是否存在 if (!function_exists('beast_encode_file')) { die("请安装并启用 php-beast 扩展!"); }
Q3:加密后页面空白
- 原因:加密过程中断或密钥不匹配。
- 解决:
tail -n 50 /var/log/php-beast.log # 查看加密日志
通过以上任一方案,你都可以安全地加密 PHP 项目。根据需求选择批量加密(方案1)或灵活单文件加密(方案2)!
🔐 二、自动化多目录加密脚本配置
脚本文件:/root/beast_encrypt_selected_dirs.php
<?php
/**
* 加密指定目录(排除敏感文件)
* 用法:php beast_encrypt_selected_dirs.php [--expire=YYYY-MM-DD] [--type=AES|DES]
*/
// ==== 配置区 ====
$selectedDirs = [
'/www/wwwroot/project/app',
'/www/wwwroot/project/config',
'/www/wwwroot/project/utils'
];
$excludeFiles = [
'/www/wwwroot/project/config/database.php', // 不加密数据库配置
'/www/wwwroot/project/utils/debug_tools.php'
];
// ===============
// 解析命令行参数
$options = getopt('', ['expire:', 'type::']);
$expire = $options['expire'] ?? '2030-12-31'; // 默认永不过期
$encryptType = $options['type'] === 'DES' ? BEAST_ENCRYPT_TYPE_DES : BEAST_ENCRYPT_TYPE_AES;
// 检查扩展
if (!function_exists('beast_encode_file')) {
die("错误:请先安装 php-beast 扩展!\n");
}
// 加密函数
function encryptFile($file, $expire, $type) {
$tmpFile = $file . '.tmp';
if (beast_encode_file($file, $tmpFile, strtotime($expire), $type)) {
rename($tmpFile, $file);
echo "[SUCCESS] $file\n";
} else {
echo "[FAILED] $file\n";
}
}
// 主逻辑
foreach ($selectedDirs as $dir) {
$files = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($dir));
foreach ($files as $file) {
if ($file->isDir() || !in_array($file->getExtension(), ['php', 'inc'])) continue;
$path = $file->getRealPath();
if (!in_array($path, $excludeFiles)) {
encryptFile($path, $expire, $encryptType);
}
}
}
echo "加密完成!过期时间: $expire\n";
?>
🚀 三、执行加密
1. 备份项目(必做!)
cp -r /www/wwwroot/project /www/wwwroot/project_backup
2. 运行加密脚本
# 默认AES加密,永不过期
php /root/beast_encrypt_selected_dirs.php
# 指定DES加密,2025年过期
php /root/beast_encrypt_selected_dirs.php --type=DES --expire=2025-12-31
3. 验证加密结果
# 检查文件头是否包含加密标记
head -n 3 /www/wwwroot/project/app/Controller.php
# 预期输出:<?php // @beast 加密乱码 ?>
⚙️ 四、Web服务器配置
1. Nginx 优先加载加密文件
server {
location ~ \.php$ {
try_files $uri.beast $uri =404; # 优先加载 .beast 文件
fastcgi_pass unix:/tmp/php-cgi-74.sock;
include fastcgi.conf;
}
}
重启 Nginx:
systemctl restart nginx
2. Apache 配置(.htaccess)
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} -f
RewriteCond %{REQUEST_FILENAME}.beast -f
RewriteRule ^(.*)\.php$ $1.beast.php [L]
</IfModule>
🔧 五、故障排查
1. 加密后页面空白
# 检查扩展是否加载
php -m | grep beast
# 查看错误日志
tail -n 50 /www/server/php/74/var/log/php-fpm.log
2. 密钥权限问题
chmod 600 /etc/php-beast/key
chown root:root /etc/php-beast/key
3. 文件系统只读
mount | grep " /www"
# 如果是 ro(read-only),重新挂载:
mount -o remount,rw /www
📜 六、重要注意事项
- 必须备份:加密不可逆,误操作可能导致代码丢失。
- 测试环境验证:先在测试服务器加密并测试功能。
- 密钥安全:
/etc/php-beast/key严禁泄露。 - 过期时间:设置合理的过期时间(如客户授权到期日)。
H[监控日志]
按此流程操作,可安全加密指定目录的 PHP 代码!### **PHP-Beast 加密项目完整流程笔记**
(适用于 **指定目录加密**,非全项目加密)
## **🎯 七、流程图总结**
```mermaid
graph TD
A[安装 php-beast] --> B[生成密钥]
B --> C[配置加密脚本]
C --> D[备份项目]
D --> E[执行加密]
E --> F[验证加密文件]
F --> G[配置 Web 服务器]
G --> H[监控日志]
按此流程操作,可安全加密指定目录的 PHP 代码!

浙公网安备 33010602011771号