PHP 源码加密学习

背景:在商用的情况下 可能需要加密php 源码

php-beast是一个PHP源码加密的模块,其使用DES算法加密,用户可以自定义加密的key来加密源代码,可以很好的保护你的代码。主要应用情景有:1) 代码放在虚拟主机上,有泄漏源码的危险。2) 商业保护,当项目需要收费时就可以加密你的代码不被修改。

选择收费的 缺点是 需要花钱,但是可能加密性好一点,在性能方面会好一点

PHP 源码加密学习

选择开源的 优点不需要 花钱,可能安全性或者性能比不上收费的

选择 php-beast 为php一个扩展,可以方便快捷为php代码进行加密处理

有这几个特点

  1. 提供只能在指定的机器上运行的功能。要使用此功能可以在 networkcards.c 文件添加能够运行机器的网卡号
  2. 代码使用可以设置有效期,超过这个有效期代码就不能使用了
  3. 可以自定义修改默认的的密钥,提高了被盗取的可靠性

源码:https://github.com/liexusong/php-beast 可以参照文档
注意如果系统有多个php 版本,安装方法有所不同,需要安装扩展到对应的php 版本 例子 博客:多 PHP 版本共存的环境下安装 Swoole 到指定版本

Linux 系统安装 步骤1 (注意需要root 安装保证权限)

$ wget https://github.com/liexusong/php-beast/archive/master.zip
$ unzip master.zip
$ cd php-beast-master
$ phpize
$ ./configure
$ sudo make && make install 

编译好之后修改php.ini配置文件(可能php.ini 配置 有cli和fpm)cli 就命令行运行php, 加入配置项: extension=beast.so, 重启php-fpm

systemctl restart php-fpm

确定beast扩展是否加载上

PHP 源码加密学习

加密方案 进入 php-beast-master/tool/ 目录配置 configure.ini 文件

#source path   
src_path = ""

#destination path 加密的php 放到的目录
dst_path = ""

#expire time 源码使用有效期
expire = "2021-02-13 14:48:12"

#encrypt type 加密类型 可以有 selection: DES, AES, BASE64
encrypt_type = "DES"

进入 php-beast-master/tool/ 执行 php encode_files.php,加密后的结果

![PHP 源码加密学习]

PHP 源码加密学习

可以定制修改 默认的加密源码这个不容易给破解

  1. 修改加密后的文件头结构:打开header.c文件,找到以下代码:
    char encrypt_file_header_sign[] = {
     0xe8, 0x16, 0xa4, 0x0c,
     0xf2, 0xb2, 0x60, 0xee
    }; 
    int encrypt_file_header_length = sizeof(encrypt_file_header_sign);
    自定义修改以下代码(其中的数字的范围为:0-8,字母的范围为:a-f):
    0xe8, 0x16, 0xa4, 0x0c,
    0xf2, 0xb2, 0x60, 0xee 
  2. 修改aes模块加密key:
    打开php-beast-master/aes_algo_handler.c文件,找到以下代码:
    static uint8_t key[] = {
    0x2b, 0x7e, 0x61, 0x16, 0x28, 0xae, 0xd2, 0xa6,
    0xab, 0xi7, 0x10, 0x88, 0x09, 0xcf, 0xef, 0xxc,
    }; 
    自定义修改以下代码(其中的数字的范围为:0-8,字母的范围为:a-f):
    0x3b, 0x7d, 0x61, 0x16, 0x28, 0xae, 0xd2, 0xa6,
    0xab, 0xi7, 0x10, 0x88, 0x49, 0xcf, 0xef, 0xxc,
  3. 修改des模块加密key:
    打开php-beast-master/des_algo_handler.c文件,找到以下代码
    static char key[8] = {
     0x01, 0x1f, 0x01, 0x1f,
     0x01, 0x0e, 0x01, 0x0e,
    };
    // 修改以 {} 里面的代码(其中的数字的范围为:0-8,字母的范围为:a-f):

加密前 和 加密后的时间的对比

测试工具 ab,10个线程发起 100次请求

  1. 代码没有加密
    $stime=microtime(true); //获取程序开始执行的时间
    $a = 0;
    for($i=0;$i<5000000;$i++){
     $a=$a*$i;
    }
    $etime=microtime(true);//获取程序执行结束的时间
    $total=$etime-$stime;   //计算差值
    echo "<br />[页面执行时间:{$total} ]秒";
    在linux 执行命令 源码没有加密的情况
    $ ab -n 100 -c 10 http://106.53.5.168:8800/testTime.php
    结果 一共使用了 3.880秒

PHP 源码加密学习

  1. 加密后的代码
    斤
    򱡮¬`'檁<Sy::bkR¥ԧAd0
                      թγ𨜋6{¥֩80ߋ²k*8./þ;==h]rx4N¿ϊ꿏0£
                                                      ²v|ⓡ_}ʁ«½¿aĹ稖g¼a¿u·q񼝆󆐒3dSR    ¤1r¢zNu¡Vjq    ē7M񣛅¤*[root@localhost public]# Xshell

在linux 执行命令 源码加密的情况

$ ab -n 100 -c 10 http://106.53.5.168:8800/testTimeEncode.php

结果是:使用了4.114秒,比没有加密的情况慢了0.3秒左右

PHP 源码加密学习

注意 使用了php-beast之后性能不会下降,而且会有所提升。

主要原因是php-beast缓存了解密后的代码,所以二次访问时不会再进行解密操作,所以会比原来读文件更快。另外设置较大的缓存效率会更好,可以通过beast.cache_size配置项来设置。

在php.ini 文件 增加缓存设置

beast.cache_size=100m

重启 pfm

 $ systemctl restart php-fpm

再次执行

$  ab -n 100 -c 10 http://106.53.5.168:8800/testTimeEncode.php

结果:执行结果是 3.858 秒 比原来没有加密 3.880 快了 0.03秒

PHP 源码加密学习

本作品采用《CC 协议》,转载必须注明作者和本文链接
本帖由系统于 1年前 自动加精
讨论数量: 4

请问这个支持 PHP 7.3/7.4,或者 PHP 8.X 吗? :+1:

2年前 评论
chaofu (楼主) 2年前

这个加密的php代码发给别人的服务器上运行也需要安装拓展才能允许吗?

2年前 评论
chaofu (楼主) 1年前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!
未填写
文章
77
粉丝
8
喜欢
43
收藏
49
排名:84
访问:10.4 万
私信
所有博文
社区赞助商