1. 程式人生 > >PHP-Beast 加密你的PHP原始碼

PHP-Beast 加密你的PHP原始碼

2449059-433f7bd316a9d80c.pngphp-beast.png

前言

首先說說為什麼要用PHP-Beast?
有時候我們的程式碼會放到代理商上, 所以很有可能程式碼被盜取,或者我們寫了一個商業系統而且不希望程式碼開源,所以這時候就需要加密我們的程式碼。
另外PHP-Beast是完全免費和開源的, 當其不能完成滿足你的需求時, 可以修改其程式碼而滿足你的要。

編譯安裝如下

注意:如果你需要使用,首先修改key。可以參考下文

Linux編譯安裝:
$ 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配置檔案, 加入配置項: extension=beast.so, 重啟php-fpm 。

配置項:
 beast.cache_size = size
 beast.log_file = "path_to_log"
 beast.log_user = "user"
 beast.enable = On
beast.log_level支援引數:
 1. DEBUG
 2. NOTICE
 3. ERROR
支援的模組有:
 1. AES
 2. DES
 3. Base64
通過測試環境:
Nginx + Fastcgi + (PHP-5.2.x ~ PHP-7.1.x)

怎麼加密你的專案

加密方案1:

安裝完 php-beast 後可以使用 tools 目錄下的 encode_files.php 來加密你的專案。使用 encode_files.php 之前先修改 tools 目錄下的 configure.ini 檔案,如下:

; source path
src_path = ""
; destination path
dst_path = ""
; expire time
expire = ""
; encrypt type (selection: DES, AES, BASE64)
encrypt_type = "DES"

src_path 是要加密專案的路徑,dst_path 是儲存加密後項目的路徑,expire 是設定專案可使用的時間 (expire 的格式是:YYYY-mm-dd HH:ii:ss)。encrypt_type是加密的方式,選擇項有:DES、AES、BASE64。 修改完 configure.ini 檔案後就可以使用命令 php encode_files.php 開始加密專案。

加密方案2:

使用beast_encode_file()函式加密檔案,函式原型如下:

beast_encode_file(string $input_file, string $output_file, int expire_timestamp, int encrypt_type)。
  1. $input_file: 要加密的檔案
  2. $output_file: 輸出的加密檔案路徑
  3. $expire_timestamp: 檔案過期時間戳
  4. $encrypt_type: 加密使用的演算法(支援:BEAST_ENCRYPT_TYPE_DES、BEAST_ENCRYPT_TYPE_AES)

制定自己的php-beast

php-beast 有多個地方可以定製的,以下一一列出:

  1. 使用 header.c 檔案可以修改 php-beast 加密後的檔案頭結構,這樣網上的解密軟體就不能認識我們的加密檔案,就不能進行解密,增加加密的安全性。

  2. php-beast 提供只能在指定的機器上執行的功能。要使用此功能可以在 networkcards.c 檔案新增能夠執行機器的網絡卡號,例如:

char *allow_networkcards[] = {
    "fa:16:3e:08:88:01",
    NULL,
};

這樣設定之後,php-beast 擴充套件就只能在 fa:16:3e:08:88:01 這臺機器上執行。另外要注意的是,由於有些機器網絡卡名可能不一樣,所以如果你的網絡卡名不是 eth0 的話,可以在 php.ini 中新增配置項: beast.networkcard = "xxx" 其中 xxx 就是你的網絡卡名,也可以配置多張網絡卡,如:beast.networkcard = "eth0,eth1,eth2"。

  1. 使用 php-beast 時最好不要使用預設的加密key,因為擴充套件是開源的,如果使用預設加密key的話,很容易被人發現。所以最好編譯的時候修改加密的key,aes模組 可以在 aes_algo_handler.c 檔案修改,而 des模組 可以在 des_algo_handler.c 檔案修改。

函式列表 & Debug

開啟debug模式:

可以在configure時加入 --enable-beast-debug 選項來開啟debug模式。開啟debug模式後需要在php.ini配置檔案中加入配置項:beast.debug_path 和 beast.debug_mode。beast.debug_mode 用於指定是否使用debug模式,而 beast.debug_path 用於輸出解密後的php指令碼原始碼。這樣就可以在 beast.debug_path 目錄中看到php-beast解密後的原始碼,可以方便知道擴充套件解密是否正確。

函式列表:
  1. beast_encode_file(): 用於加密一個檔案
  2. beast_avail_cache(): 獲取可以快取大小
  3. beast_support_filesize(): 獲取beast支援的最大可加密檔案大小
  4. beast_file_expire(): 獲取一個檔案的過期時間
  5. beast_clean_cache(): 清空beast的所有快取(如果有檔案更新, 可以使用此函式清空快取)

修改預設加密的key

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):

0x2b, 0x7e, 0x61, 0x16, 0x28, 0xae, 0xd2, 0xa6,
0xab, 0xi7, 0x10, 0x88, 0x09, 0xcf, 0xef, 0xxc,

3,修改des模組加密key:
開啟php-beast-master/des_algo_handler.c檔案,找到以下程式碼:

static char key[8] = {
0x21, 0x1f, 0xe1, 0x1f,
0xy1, 0x9e, 0x01, 0x0e,
};

自定義修改以下程式碼(其中的數字的範圍為:0-8,字母的範圍為:a-f):

0x21, 0x1f, 0xe1, 0x1f,
0xy1, 0x9e, 0x01, 0x0e,

4,修改base64模組加密key:
開啟php-beast-master/base64_algo_handler.c檔案,自定義修改以下程式碼:

static const short base64_reverse_table[256] = {
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 62, -1, -1, -1, 63,
52, 53, 54, 55, 56, 57, 58, 59, 60, 61, -1, -1, -1, -1, -1, -1,
-1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, -1, -1, -1, -1, -1,
-1, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40,
41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1
};

php-beast自定義加密模組

一,首先建立一個.c的檔案。例如我們要編寫一個使用base64加密的模組,可以建立一個名叫base64_algo_handler.c的檔案。然後在檔案新增如下程式碼:
#include "beast_module.h"
int base64_encrypt_handler(char *inbuf, int len, char **outbuf, int *outlen)
{
    ...
}
int base64_decrypt_handler(char *inbuf, int len, char **outbuf, int *outlen)
{
    ...
}
void base64_free_handler(void *ptr)
{
    ...
}
struct beast_ops base64_handler_ops = {
    .name = "base64-algo",
    .encrypt = base64_encrypt_handler,
    .decrypt = base64_decrypt_handler,
    .free = base64_free_handler,
};

模組必須實現3個方法,分別是:encrypt、decrypt、free方法。
encrypt方法負責把inbuf字串加密,然後通過outbuf輸出給beast。
decrypt方法負責把加密資料inbuf解密,然後通過outbuf輸出給beast。
free方法負責釋放encrypt和decrypt方法生成的資料

二,寫好我們的加密模組後,需要在global_algo_modules.c新增我們模組的資訊。程式碼如下:
#include <stdlib.h>
#include "beast_module.h"
extern struct beast_ops des_handler_ops;
extern struct beast_ops base64_handler_ops;
struct beast_ops *ops_handler_list[] = {
    &des_handler_ops,
    &base64_handler_ops, /* 這裡是我們的模組資訊 */
    NULL,
};
三,修改config.m4檔案,修改倒數第二行,如下程式碼:

PHP_NEW_EXTENSION(beast, beast.c des_algo_handler.c beast_mm.c spinlock.c cache.c beast_log.c global_algo_modules.c * base64_algo_handler.c *, $ext_shared)

base64_algo_handler.c的程式碼是我們新增的,這裡加入的是我們模組的檔名。
現在大功告成了,可以編譯試下。如果要使用我們剛編寫的加密演算法來加密php檔案,可以修改php.ini檔案的配置項,如下:
``
beast.encrypt_handler = "base64-algo"`

名字就是我們模組的name。