这里会显示出您选择的修订版和当前版本之间的差别。
两侧同时换到之前的修订记录 前一修订版 后一修订版 | 前一修订版 上一修订版 两侧同时换到之后的修订记录 | ||
appcenter:encrypt [2019/02/12 17:05] zsx |
appcenter:encrypt [2019/03/19 14:12] zsx |
||
---|---|---|---|
行 4: | 行 4: | ||
目前处于内测状态,Z-Blog应用中心开发者可暂时免费使用。 | 目前处于内测状态,Z-Blog应用中心开发者可暂时免费使用。 | ||
- | 如何正确地加密:见:[[appcenter:encrypt:guide|]] | ||
- | |||
- | ===== 特性 ===== | ||
- | 1. 使用虚拟机执行字节码。 | ||
- | |||
- | 2. 最大限度保留PHP的有关动态功能。 | ||
- | |||
- | 3. 最低支持至PHP 5.2。 | ||
- | |||
- | 4. 无需扩展。 | ||
- | |||
- | 5. 如果你的PHP文件是一个Z-BlogPHP应用的组成部分,且这个应用上架到了Z-Blog应用中心,那么,用户的每次下载,都会自动触发加密,让每一个用户下载到的文件都完全不同。 | ||
- | |||
- | ==== 优势 ==== | ||
- | |||
- | 传统的加密,有几种形式: | ||
- | |||
- | 1. 混淆型“加密”:只是将变量名修改了一下,更换一个可以修改变量名的文本编辑器即可编辑,对于反破解几乎没有帮助。 | ||
- | |||
- | 2. 预先加密:直接把源代码进行加密,运行时解密源码后进行eval以实现“加密”效果。通过Hook eval,或者Hook Zend的编译入口 ``zend_compile_string`` 即可得到源码,甚至没有混淆型来得有用。 | ||
- | |||
- | 3. 扩展加密:通过各种编译手段将PHP代码编译为不可识别的代码,但需要服务器加装特定扩展。 | ||
- | |||
- | Z5加密综合了123三种加密形式。其将PHP源码编译成难以还原成源码的字节码,之后通过PHP实现的虚拟机来对字节码进行运行,从根本上杜绝了被通用解密手段所破解,并且不需要服务器安装特定的扩展。 | ||
- | |||
- | ==== 劣势 ==== | ||
- | |||
- | 1. 因每个函数均带一个虚拟机实现,因此生成的文件相对大。 | ||
- | |||
- | 2. 加密函数的运行速度相对较慢。 | ||
- | |||
- | ===== 使用场景 ===== | ||
- | |||
- | 加密主要用于防破解授权,考虑到加密函数执行较慢,因此,你可以在以下场合应用加密: | ||
- | |||
- | 1. 需要运行某些速度慢的功能时,如批量发邮件等,可在这之前调用加密过的函数,来检查用户授权。 | ||
- | |||
- | 2. 在用户安装你的应用的时候(对应Z-BlogPHP的InstallPlugin函数)。 | ||
- | |||
- | |||
- | ===== 使用 ===== | ||
- | |||
- | 1. 由于加密后的文件不可被一般的文本编辑器编辑,因此,你需要把你要加密的函数,单独抽出一个新文件。 | ||
- | |||
- | 2. 本程序以函数加密为核心,因此,你有两种加密方式: | ||
- | |||
- | ==== 加密全文件 ==== | ||
- | |||
- | 需要注意,本加密仅对函数进行加密,不加密任何全局内容。因此,如果需要加密整个文件,需要你把游离在函数之外的内容包装进一个函数。 | ||
- | |||
- | 你可以在你不想要加密的函数头部,加入 | ||
- | <code php> | ||
- | /** | ||
- | * @Z5NotEncrypt | ||
- | */ | ||
- | </code> | ||
- | |||
- | 示例:(以下文件仅b函数不会被加密) | ||
- | |||
- | <code php> | ||
- | <?php | ||
- | /** | ||
- | * @Z5EncryptEntire | ||
- | */ | ||
- | f(); | ||
- | |||
- | function a() | ||
- | { | ||
- | $j = 1; | ||
- | while ($j <= 9) { | ||
- | $i = 1; | ||
- | while ($i <= $j) { | ||
- | echo "{$i}x{$j}=" . ($i * $j) . " "; | ||
- | $i++; | ||
- | } | ||
- | echo "\n"; | ||
- | $j++; | ||
- | } | ||
- | } | ||
- | |||
- | function f () { | ||
- | echo "Hello World\n"; | ||
- | } | ||
- | |||
- | /** | ||
- | * @Z5NotEncrypt | ||
- | */ | ||
- | function b () { | ||
- | try { | ||
- | throw new Exception('No don\'t encrypt me'); | ||
- | } catch (Exception $e) { | ||
- | echo 'look you dont support it'; | ||
- | } | ||
- | } | ||
- | |||
- | class C { | ||
- | |||
- | public $a = 123456; | ||
- | |||
- | public function e ($z) { | ||
- | var_dump($this->a); | ||
- | var_dump(func_get_Args()); | ||
- | return $z; | ||
- | } | ||
- | } | ||
- | |||
- | function run () { | ||
- | a(); | ||
- | b(); | ||
- | $a = new C(); | ||
- | var_dump($a->e(123456)); | ||
- | } | ||
- | run(); | ||
- | </code> | ||
- | |||
- | ==== 仅加密函数 ==== | ||
- | |||
- | 在你要加密的函数头部,加入 | ||
- | <code php> | ||
- | /** | ||
- | * @Z5Encrypt | ||
- | */ | ||
- | </code> | ||
- | |||
- | 即可启用加密。如以下示例,a、C::d、c::e均被加密。 | ||
- | |||
- | <code php> | ||
- | <?php | ||
- | /** | ||
- | * @Z5Encrypt | ||
- | */ | ||
- | function a() | ||
- | { | ||
- | $j = 1; | ||
- | while ($j <= 9) { | ||
- | $i = 1; | ||
- | while ($i <= $j) { | ||
- | echo "{$i}x{$j}=" . ($i * $j) . " "; | ||
- | $i++; | ||
- | } | ||
- | echo "\n"; | ||
- | $j++; | ||
- | } | ||
- | } | ||
- | |||
- | function b () { | ||
- | try { | ||
- | echo 'No don\'t encrypt me'; | ||
- | } catch (Exception $e) { | ||
- | echo 'look you dont support it'; | ||
- | } | ||
- | } | ||
- | |||
- | class C { | ||
- | |||
- | public $a = 123456; | ||
- | /** | ||
- | * @Z5Encrypt | ||
- | * 注:PHP 5.2下,无法运行静态成员函数 | ||
- | */ | ||
- | public static function d () { | ||
- | echo 123456; | ||
- | echo 1 . "\n"; | ||
- | echo 23333 . "\n"; | ||
- | } | ||
- | |||
- | /** | ||
- | * @Z5Encrypt | ||
- | */ | ||
- | public function e ($z) { | ||
- | var_dump($this->a); | ||
- | var_dump(func_get_Args()); | ||
- | return $z; | ||
- | } | ||
- | } | ||
- | |||
- | a(); | ||
- | b(); | ||
- | C::d(); | ||
- | $a = new C(); | ||
- | var_dump($a->e(123456)); | ||
- | |||
- | </code> | ||
- | |||
- | ===== 局限 ===== | ||
- | |||
- | - 仅支持函数加密; | ||
- | - 引用部分可能与PHP实现不同,请尽量少使用引用; | ||
- | - 如使用动态语法(如$$x),或修改全局变量(如$_GET['a'] = 1),加密程序将不会删除变量名; | ||
- | - 不支持try、catch,但是可以throw; | ||
- | - 不支持函数内定义function class lambda等; | ||
- | - 不支持Generator和yield; | ||
- | - 不支持写静态变量(可以读); | ||
- | - 不支持 ?? 语法; | ||
- | - 不支持declare和tick; | ||
- | - 不支持声明函数参数为可变参数; | ||
- | - 在PHP 5.2下,无法运行加密后的静态成员 | ||
+ | 介绍页已移动至:https://z5encrypt.com/docs/ | ||
+ | 使用说明已移动至:https://z5encrypt.com/docs/usage/ |