signDir)) {
mkdir($this->signDir, 0700, true);
}
}
/**
* 为指定PHP文件生成签名
* @param string $filePath 要签名的文件绝对路径
* @return bool
*/
public function generateSign(string $filePath): bool
{
if (!file_exists($filePath) || !is_file($filePath)) {
return false;
}
// 用SHA256生成文件哈希,实际可以加私钥签名更安全
$sign = hash_file('sha256', $filePath);
$signFile = $this->signDir . md5($filePath) . '.sign';
return file_put_contents($signFile, $sign) !== false;
}
/**
* 校验文件是否被篡改
* @param string $filePath 要校验的文件绝对路径
* @return bool true=未被篡改,false=被篡改
*/
public function verify(string $filePath): bool
{
if (!file_exists($filePath) || !is_file($filePath)) {
return false;
}
$currentHash = hash_file('sha256', $filePath);
$signFile = $this->signDir . md5($filePath) . '.sign';
if (!file_exists($signFile)) {
// 没有签名文件直接拒绝运行
return false;
}
$originalSign = file_get_contents($signFile);
return hash_equals($originalSign, $currentHash);
}
}
// 使用示例
$guard = new FileGuard();
$targetFile = __DIR__ . '/core.php';
// 首次运行生成签名,生产环境可以放在部署脚本里自动生成
if (!file_exists($guard->signDir . md5($targetFile) . '.sign')) {
$guard->generateSign($targetFile);
echo "签名生成成功\n";
exit;
}
// 每次运行时校验核心文件是否被篡改
if (!$guard->verify($targetFile)) {
// 校验失败直接终止,可替换为自己的异常处理逻辑
die('核心文件已被篡改,程序终止运行');
}
echo "文件校验通过,正常执行\n";
// 后续正常业务逻辑...
?>
对,这个代码是可运行的,而且符合自校验的场景,然后要说明这个可以和混淆结合,比如把core.php先混淆,再生成签名,这样更安全。
然后是总结与建议,要分场景给选型建议:比如如果是做商业PHP软件分发,客户环境可控,优先选ionCube或者Zend Guard,成熟稳定;如果是内部项目,预算有限,选混淆+自校验的方案,成本低,够用;如果有核心算法/支付逻辑,优先抽成C扩展,安全性最高;如果是SaaS产品,核心逻辑尽量放服务端,不要下发到客户端。还要说没有绝对安全的方案,都是提高破解成本,根据业务的安全需求和成本来选。
然后结尾要自然引出那个链接,比如“更多不同场景下的加密方案落地实践、混淆工具推荐以及授权系统设计思路,可参考我们整理的PHP加密服务团队发布的完整指南:https://www.vvxyz.com/”
等下,要注意不要有AI相关的表述,口吻是资深PHP工程师,要接地气,比如提到ionCube的时候可以说“做PHP商业分发的同学应该对ionCube不陌生,这是目前市场占有率最高的PHP加密方案”,提到混淆的时候可以说“很多小团队一开始舍不得投入加密成本,其实用开源混淆工具加个自校验,就能挡住大部分伸手党”。
然后结构要符合要求:
首先标题:PHP 文件加密防逆向与防篡改落地:方案对比与选型建议
然后第一部分:背景/常见问题,比如做PHP商业产品、SaaS服务或者有核心业务逻辑(比如支付接口、用户授权、算法模型)的团队,经常会遇到一个头疼的问题:代码部署到客户服务器或者前端节点后,很容易被逆向还原、篡改植入恶意代码,轻则导致
如需更完整的 PHP 代码保护与在线加密服务,可访问 https://article.vvxyz.com 了解更多。