多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
https://docs.pingcode.com/ask/ask-ask/227444.html ## 概述 PHP源代码编译加密通常是出于保护知识产权、防止源代码泄露和被非法修改的目的。加密PHP源代码可以使用先进的加密工具如Zend Guard或ionCube、使用代码混淆技术、或开发自定义编译扩展。 最关键的是,在加密的同时,确保服务器有相应的解密扩展来执行代码,否则加密代码将无法运行。换言之,加密和执行是一个密不可分的过程。本章节我们将主要展开讨论使用Zephir语言编写动态扩展库进行代码加密。 > Zephir使用PHP编译器将源代码编译成二进制文件,这样可以隐藏代码逻辑和实现细节。可以把通用业务类,都编译成二进制拓展,对外只提供`.so`文件,也就不需要加密代码了。 ## Zephir Zephir是一个开源的高级语言(区别于汇编等机器语言),它的设计是为了减轻PHP原生扩展的创建难度和可维护性,另外还带来了强类型与内存安全的支持。 Zephir是一门定位于大多数想通过编写和编译能够被PHP执行的代码的PHPer需求的语言。它是一种动态和静态类型结合的语言,对于PHP来说,它的一些功能可能会感觉时曾相识。 Zephir 入门教程请看这里 [【使用Zephir语言给PHP编写C语言扩展】](https://mp.weixin.qq.com/s?__biz=MzUzMDMxNTQ4Nw==&mid=2247492848&idx=1&sn=c520c1f0021c94c5379310806c32ae44&chksm=fa510540cd268c5659192fce3540100bbf3410e403456129682bcd1caef6bc79259da363415f#rd) ## 应用 本章节使用个人仓库 https://github.com/Tinywan/zephir-lang-php-extension 进行简单实现一个业务代码的认证授权加密代码。 ### 下载代码 ``` git clone https://github.com/Tinywan/zephir-lang-php-extension.git ``` ### 目录结构 ```ts . ├── zephirencrypt -- 加密扩展库目录 │   ├── Auth │   │   └── License.zep -- 权限认证 │   ├── Common │   │   └── AbstractModule.zep -- 模块抽象类 │   └── Module -- 业务模块目录 │   └── LiveModule.zep ├── config.json -- 编译扩展配置文件 └── ext -- 编译生成的.so文件 ``` 授权许可证`License.zep` ```php /** * @desc 授权许可证 * @author Tinywan(ShaoBo Wan) * @date 2024/6/16 20:14 */ namespace ZephirEncrypt\Auth; class License { /** * @desc 授权认证 * @author Tinywan(ShaoBo Wan) */ public static function check(string service_uuid, string auth_license, int uid = 0, int rand = 0) { var private_key = "tinywan2024"; var expire_time = substr(auth_license, 0, 10); var current_time = time(); var sequest_hash_value = substr(auth_license, -32); var res_hash_value = md5(service_uuid . "-" . expire_time . "-" . rand . "-" . uid . "-" . private_key); if expire_time < current_time { return -1; } if sequest_hash_value != res_hash_value { return 0; } return 1; } } ``` 业务模块抽象类`AbstractModule.zep` ``` /** * @desc 抽象业务模块 * @author Tinywan(ShaoBo Wan) * @date 2024/6/16 20:14 */ namespace ZephirEncrypt\Common; use ZephirEncrypt\Auth\License; abstract class AbstractModule { protected service_uuid; protected auth_license; /** 1 true , 0 false */ public auth_status = 0; /** * @desc 构架函数 * @author Tinywan(ShaoBo Wan) */ public function __construct(string service_uuid, string auth_license) { let this->service_uuid = service_uuid; let this->auth_license = auth_license; var checkRes = License::check(this->service_uuid, this->auth_license); if checkRes == -1 { let this->auth_status = -1; } if checkRes == 0 { let this->auth_status = 0; } if checkRes == 1 { let this->auth_status = 1; } } /** 获取权限状态 */ abstract public function getAuthStatus(); } ``` 直播业务模块`LiveModule.zep` ``` /** * @desc 直播业务模块 * @author Tinywan(ShaoBo Wan) * @date 2024/6/16 20:14 */ namespace ZephirEncrypt\Module; use ZephirEncrypt\Common\AbstractModule; class LiveModule extends AbstractModule { /** * @desc 构架函数 * @author Tinywan(ShaoBo Wan) */ final public function __construct(string service_uuid, string auth_license) { parent::__construct(service_uuid, auth_license); } /** * @desc 获取权限状态 * @author Tinywan(ShaoBo Wan) */ public function getAuthStatus() { return $this->auth_status; } /** * @desc 业务测试 * @author Tinywan(ShaoBo Wan) */ public function start() { var res = []; if this->auth_status != 1 { let res = ["code":this->auth_status, "msg":"no permission to access"]; return json_encode(res); } echo "直播开始成功.............."; echo "这里开始写你的业务代码....."; echo "这里开始写你的业务代码....."; echo "这里开始写你的业务代码....."; } } ``` ### 编译并生成扩展 ``` cd zephir-lang-php-extension/ # 进入加密扩展库目录 cd zephirencrypt ``` 编译并生成扩展 ``` zephir build ``` 如果一切顺利,您将在输出的末尾看到以下消息: ``` zephir-lang-php-extension/zephirencrypt# zephir build Cleaning old kernel files... Copying new kernel files... Preparing for PHP compilation... Preparing configuration file... Compiling... Zephir version has changed, use "zephir fullclean" to perform a full clean of the project Installing... Extension installed. Add "extension=zephirencrypt.so" to your php.ini ! [NOTE] Don't forget to restart your web server ``` 在上面的步骤中,您可能需要提供root密码才能安装扩展。 最后,必须将扩展添加到`php.ini`才能由PHP加载。这是通过添加初始化指令:`extension=zephirencrypt.so`来实现的。 > 注意:您也可以在命令行中使用`-d extension=zephirencrypt.so`加载它,但它只会为单个请求加载,因此每次您想要在CLI中测试扩展时都需要包含它。将指令添加到`php.ini`将确保从那时起为每个请求加载它。 ### 测试 现在扩展已添加到您的 `php.ini` 中,请执行以下命令检查扩展是否正确加载: ``` php -m [PHP Modules] apcu .... zephir_parser zephirencrypt ... [Zend Modules] ``` 扩展名`zephirencrypt`应该是表明扩展名已正确加载。 ## 如何使用 新建测试文件`zephir.php` ```php <?php /** * @desc zephir.php 描述信息 * @author Tinywan(ShaoBo Wan) * @date 2024/8/5 22:51 */ declare(strict_types=1); $serviceUuid = "13c7c8e1-3ac2-41a6-95dc-ff954b431bbf"; $authLicense = "1728869954-0-0-eabfb0fb52c429d4fa037585f7afd512"; $liveModule = new \ZephirEncrypt\Module\LiveModule($serviceUuid, $authLicense); print_r($liveModule); $res = $liveModule->start(); var_dump($res); ``` 以上授权码时间为`1528869954` ,即:`2018-06-13 14:05:54`,预期结果是该授权码已过期,执行代码预期结果 ``` ZephirEncrypt\Module\LiveModule Object ( [service_uuid:protected] => 13c7c8e1-3ac2-41a6-95dc-ff954b431bbf [auth_license:protected] => 1528869954-0-0-eabfb0fb52c429d4fa037585f7afd512 [auth_status] => -1 ) ``` 可以看到此时授权码状态是`-1`表示授权码过期。尝试授权码为未来某一天`1788689954` ,即:`2026-09-06 18:19:14` ``` $authLicense = "1788689954-0-0-eabfb0fb52c429d4fa037585f7afd512"; ``` 预期结果相同 ``` ZephirEncrypt\Module\LiveModule Object ( [service_uuid:protected] => 13c7c8e1-3ac2-41a6-95dc-ff954b431bbf [auth_license:protected] => 1788689954-0-0-eabfb0fb52c429d4fa037585f7afd512 [auth_status] => 0 ) ``` 正确的授权码 ``` ZephirEncrypt\Module\LiveModule Object ( [service_uuid:protected] => 13c7c8e1-3ac2-41a6-95dc-ff954b431bbf [auth_license:protected] => 178909089954-0-0-eabfb0fb52c429d4fa037585f7afd512 [auth_status] => 1 ) string(42) "直播开始成功............." string(42) "这里开始写你的业务代码...." string(42) "这里开始写你的业务代码...." string(42) "这里开始写你的业务代码...." ```