PHP加密授权源码解析与应用
在SaaS服务或商业PHP系统中,授权机制是保障软件合法分发的核心环节。本文以轻量、安全、可落地的方式,解析一个基于openssl和时间戳签名的PHP授权验证模型。
核心设计思路
采用「客户端绑定 + 服务端验签」双保险: ① 授权码(License)由服务端用私钥签名生成; ② 客户端仅需验证签名有效性及有效期,不暴露密钥; ③ 支持域名/机器码绑定,防止非法复制。
服务端生成授权码(示例)
<?php
// generate_license.php —— 服务端调用(需openssl扩展)
$privateKey = file_get_contents('private.key'); // RSA私钥
$data = [
'domain' => 'example.com',
'expires' => time() + 30 * 86400, // 30天过期
'features' => ['api', 'report']
];
$json = json_encode($data, JSON_UNESCAPED_UNICODE);
openssl_sign($json, $signature, $privateKey, OPENSSL_ALGO_SHA256);
$license = base64_encode($json) . '.' . base64_encode($signature);
echo "授权码:{$license}\n";
?>
客户端验证授权码(核心逻辑)
<?php
// verify_license.php —— 集成于您的系统入口
function verifyLicense($license, $publicKeyPath = 'public.key') {
if (!preg_match('/^([A-Za-z0-9+\/=]+)\.([A-Za-z0-9+\/=]+)$/', $license, $m)) {
return ['valid' => false, 'msg' => '格式错误'];
}
$json = base64_decode($m[1]);
$sig = base64_decode($m[2]);
$pubKey = file_get_contents($publicKeyPath);
if (!openssl_verify($json, $sig, $pubKey, OPENSSL_ALGO_SHA256)) {
return ['valid' => false, 'msg' => '签名无效'];
}
$data = json_decode($json, true);
if (time() > $data['expires']) {
return ['valid' => false, 'msg' => '授权已过期'];
}
// 可选:校验当前域名是否匹配
if ($data['domain'] !== $_SERVER['HTTP_HOST'] ?? '') {
return ['valid' => false, 'msg' => '域名不匹配'];
}
return ['valid' => true, 'data' => $data];
}
// 使用示例
$result = verifyLicense('eyJk...'); // 实际授权码
if (!$result['valid']) {
die("授权失败:{$result['msg']}");
}
echo "授权有效,功能:" . implode(',', $result['data']['features']);
?>
⚠️ 安全提醒:
• 私钥必须严格保密,禁止打包进客户端;
• 公钥可内置,但建议结合混淆(如拆分字符串、动态拼接)防轻易提取;
• 生产环境应配合服务器心跳校验或离线缓存策略提升鲁棒性。
该方案无需第三方依赖,兼容PHP 7.2+,兼顾安全性与部署便捷性。实际项目中,可进一步集成机器指纹(如CPU序列号哈希)、多级授权(试用版/专业版)或在线激活流程,构建更完整的商业授权体系。
技术的本质不是堆砌复杂,而是用恰当的工具解决真实问题——加密授权,亦当如此。
```