blencを使って、phpのソースコードを暗号化するテスト。
必要なパッケージをインストール
yum -y install php php-devel php-pear gcc-c++
blencはyumだと見当たらないので、peclでインストールする。
pecl install blenc channel://pecl.php.net/blenc-1.1.4b
実行時、Enable BLENC? [autodetect] :と聞かれるので、そのままエンターキーを押す。
インストールが終わったら、以下の表示が出ているはず。
Build process completed successfully
Installing '/usr/lib64/php/modules/blenc.so'
install ok: channel://pecl.php.net/blenc-1.1.4b
configuration option "php_ini" is not set to php.ini location
You should add "extension=blenc.so" to php.ini
php.iniに、extension=blenc.soを足せ、ということで、
php.iniに直接ではなく、php.d/blenc.iniを作って、そこに書き込む。
また、後述する配布用の鍵のパスを指定する。
配布用の鍵のパスは、デフォルトだと/usr/local/etc/blenckeysになっている。
echo "extension=blenc.so" > /etc/php.d/blenc.ini
echo "blenc.key_file=/root/blenckey" >> /etc/php.d/blenc.ini
暗号化したいphpファイルを用意。
以下テストとして作成。
input.php
<?php
echo "Hello world.\n";
?>
blencを使って、暗号化するためのphpファイルを作成
blenc.php
<?php
// 第1引数 暗号化したいphpファイル
// 第2引数 暗号化したphpファイルの保存先
// 第3引数 配布用の鍵の保存先
$input_file = $argv[1];
$output_file = $argv[2];
$key_file = $argv[3];
// 鍵。任意の文字列。念のためmd5している。
$private_key = md5('my_key_phrase');
// file_get_contents関数を使って暗号化したいphpファイルを読み込む。
$source = file_get_contents($input_file);
// 読み込んだphpファイルに含まれる、都合の悪い文字列を削除しておく・・・。
// たぶんblencのバグだけど、これをしないと、暗号化したphpファイルを実行したとき、
// エラーになって動かない。
$contents = preg_replace(array('/^<(\?|\%)\=?(php)?/', '/(\%|\?)>$/'), array('',''), $source);
// 暗号化処理。成功すると、暗号化したファイルが指定したパスに作成される。
// また、戻り値として、配布用の鍵の中身が得られる。
$public_key = blenc_encrypt($contents, $output_file, $private_key);
// 配布用の鍵の中身を、指定したパスに出力しておく。
file_put_contents($key_file, $public_key . PHP_EOL);
?>
以下一連の作業
[root@localhost ~]# uname -a
Linux localhost.localdomain 2.6.32-642.11.1.el6.x86_64 #1 SMP Fri Nov 18 19:25:05 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux
[root@localhost ~]#
[root@localhost ~]# /usr/bin/php --version
PHP 5.3.3 (cli) (built: Aug 11 2016 20:33:53)
Copyright (c) 1997-2010 The PHP Group
Zend Engine v2.3.0, Copyright (c) 1998-2010 Zend Technologies
[root@localhost ~]#
[root@localhost ~]# pecl list
Installed packages, channel pecl.php.net:
=========================================
Package Version State
blenc 1.1.4b beta
[root@localhost ~]#
[root@localhost ~]# cat /etc/php.d/blenc.ini
extension=blenc.so
blenc.key_file=/root/blenckey
[root@localhost ~]#
[root@localhost ~]# cat input.php
<?php
echo "Hello world.\n";
?>
[root@localhost ~]# cat blenc.php
<?php
// 第1引数 暗号化したいphpファイル
// 第2引数 暗号化したphpファイルの保存先
// 第3引数 配布用の鍵の保存先
$input_file = $argv[1];
$output_file = $argv[2];
$key_file = $argv[3];
// 鍵。任意の文字列。念のためmd5している。
$private_key = md5('my_key_phrase');
// file_get_contents関数を使って暗号化したいphpファイルを読み込む。
$source = file_get_contents($input_file);
// 読み込んだphpファイルに含まれる、都合の悪い文字列を削除しておく・・・。
// たぶんblencのバグだけど、これをしないと、暗号化したphpファイルを実行したとき、
// エラーになって動かない。
$contents = preg_replace(array('/^<(\?|\%)\=?(php)?/', '/(\%|\?)>$/'), array('',''), $source);
// 暗号化処理。成功すると、暗号化したファイルが指定したパスに作成される。
// また、戻り値として、配布用の鍵の中身が得られる。
$public_key = blenc_encrypt($contents, $output_file, $private_key);
// 配布用の鍵の中身を、指定したパスに出力しておく。
file_put_contents($key_file, $public_key . PHP_EOL);
?>
[root@localhost ~]#
[root@localhost ~]# /usr/bin/php blenc.php input.php output.php blenckey
[root@localhost ~]#
[root@localhost ~]# ll input.php output.php blenckey
-rw-r--r-- 1 root root 45 12月 1 11:08 2016 blenckey
-rw-r--r-- 1 root root 32 12月 1 10:46 2016 input.php
-rw-r--r-- 1 root root 104 12月 1 11:08 2016 output.php
[root@localhost ~]#
[root@localhost ~]# vi output.php
[root@localhost ~]#
BLENC^@^@^@1.1.4b^@^@^@^@^@^@^@^@^@^@bf7264349ce07405f2e687cf5d188682^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@OA^S^Vo^TI^PcCZX<96><9f>ejD±X ±{!cO$e2<89><99>,}
~
~
~
~
[root@localhost ~]#
[root@localhost ~]# cat blenckey
/coNbBdL3kaDFcyIMetvgSKXtGKGaBf2Cc4XPW30gPI=
[root@localhost ~]#
[root@localhost ~]#
[root@localhost ~]# /usr/bin/php output.php
Hello world.
[root@localhost ~]#
[root@localhost ~]#