对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
输出路径灵活性 需固定输出目录 可自由指定输出路径

⚠️ 注意事项

  1. 备份源码
    加密前务必备份原始文件:

    cp -r /www/wwwroot/server.cc/public /www/wwwroot/server.cc/public_backup
    
  2. 密钥安全
    确保 /etc/php-beast/key 文件权限为 600

    chmod 600 /etc/php-beast/key
    
  3. 测试加密文件
    加密后务必在测试环境验证功能是否正常:

    php -f /www/wwwroot/server.cc/public_encrypted/index.php
    
  4. 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

📜 六、重要注意事项

  1. 必须备份:加密不可逆,误操作可能导致代码丢失。
  2. 测试环境验证:先在测试服务器加密并测试功能。
  3. 密钥安全/etc/php-beast/key 严禁泄露。
  4. 过期时间:设置合理的过期时间(如客户授权到期日)。

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 代码!

posted @ 2025-05-16 09:35  norie  阅读(336)  评论(0)    收藏  举报