Z-Blog Wiki Z-Blog Wiki

Z-Blog官方文档

用户工具

站点工具


appcenter:encrypt

Z5加密

Z5加密是由Z-Blog应用中心推出的PHP加密方案,也是Z-Blog应用中心唯一支持的加密方案。为确保用户权益,只有Z5加密后的加密文件被允许上架到应用中心。

目前处于内测状态,Z-Blog应用中心开发者可暂时免费使用。

如何正确地加密,见:授权验证指南

特性

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. 本程序以函数加密为核心,因此,你有两种加密方式:

加密全文件

需要注意,本加密仅对函数进行加密,不加密任何全局内容。因此,如果需要加密整个文件,需要你把游离在函数之外的内容包装进一个函数。

你可以在你不想要加密的函数头部,加入

  /**
   * @Z5NotEncrypt
   */

示例:(以下文件仅b函数不会被加密)

<?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();

仅加密函数

在你要加密的函数头部,加入

  /**
   * @Z5Encrypt
   */

即可启用加密。如以下示例,a、C::d、c::e均被加密。

<?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));

局限

  1. 仅支持函数加密;
  2. 引用部分可能与PHP实现不同,请尽量少使用引用;
  3. 如使用动态语法(如$$x),或修改全局变量(如$_GET['a'] = 1),加密程序将不会删除变量名;
  4. 不支持try、catch,但是可以throw;
  5. 不支持函数内定义function class lambda等;
  6. 不支持Generator和yield;
  7. foreach在使用迭代器时不支持写;
  8. 在foreach内尽量避免对被foreach的对象的 += -= *= /= 等语法;
  9. 不支持写静态变量(可以读);
  10. 不支持 ?? 语法;
  11. 不支持declare和tick;
  12. 不支持声明函数参数为可变参数;
  13. 在PHP 5.2下,无法运行加密后的静态成员
appcenter/encrypt.txt · 最后更改: 2019/02/13 23:07 由 zsx