无需装扩展,也无需花钱,就用PHP源码加密你的文件,内网离线可用,别人改不动,只有你能改。
以laravel框架app/Http/Controllers/UserController.php文件示例:
1.生成密钥
php -r "echo base64_encode(random_bytes(32));"
2.加密脚本
app同级目录创建文件: encrypt.php
//填充内容
<?php
$key = base64_decode('24ndU8………'); //刚刚生成的密钥
$src = file_get_contents('./app/Http/Controllers/UserController.php'); //文件的路径
$compressed = gzcompress($src, 9);
$iv = substr($key, 0, 16);
$cipher = openssl_encrypt($compressed, 'aes-256-cbc', $key, OPENSSL_RAW_DATA, $iv);
file_put_contents(
'./app/Http/Controllers/UserController.php.enc', //加密的文件
'<?php ' . base64_encode($cipher)
);
3.执行加密脚本
php encrypt.php
4.制作「加载器」
//创建一个文件,制作加载器,运行加密的文件
<?php
$key = base64_decode('24ndU8………'); //相同的密钥
$raw = file_get_contents(__DIR__ . '/UserController.php.enc');
$cipher = base64_decode(substr($raw, 6));
$iv = substr($key, 0, 16);
$dec = openssl_decrypt($cipher, 'aes-256-cbc', $key, OPENSSL_RAW_DATA, $iv);
$code = gzuncompress($dec);
if ($code === false) abort(500, 'Controller corrupted');
eval('?>' . $code);
5.后续升级
- 本地改好原文件
- 再跑 php encrypt.php
- 只替换 .php.enc 文件即可上线
以上方法需要更改加密的文件,太繁琐了,我们可以在加密脚本的时候传入需要加密的文件即可,将加密脚本修改一下
<?php
if ($argc !== 2) {
echo "用法: php encrypt.php <文件路径>\n";
exit(1);
}
$inFile = realpath($argv[1]);
if (!is_file($inFile)) {
echo "文件不存在: {$argv[1]}\n";
exit(1);
}
$key = base64_decode('24ndU8………');
$src = file_get_contents($inFile);
$compressed = gzcompress($src, 9);
$iv = substr($key, 0, 16);
$cipher = openssl_encrypt($compressed, 'aes-256-cbc', $key, OPENSSL_RAW_DATA, $iv);
file_put_contents(
$inFile . '.enc',
'<?php ' . base64_encode($cipher)
);
//执行
php encrypt.php app/Http/Controllers/UserController.php