PHP加密授权源码解析与应用
在SaaS服务、商业PHP组件或独立软件分发中,授权机制是保障知识产权的关键环节。本文以轻量、可落地的方案为例,解析基于openssl_encrypt与时间戳签名的PHP授权验证逻辑。
核心设计思路
授权文件(如 license.key)采用「AES-256-CBC 加密 + HMAC 签名 + 过期时间」三重保护:
- 加密防止明文篡改
- HMAC 防止密钥泄露后被伪造
- 内置有效期(如 365 天)实现订阅式管理
授权生成示例(服务端)
<?php
function generateLicense($domain, $secretKey, $days = 365) {
$payload = json_encode([
'domain' => $domain,
'issued_at' => time(),
'expires_at' => time() + ($days * 86400),
'version' => '1.0'
]);
// AES 加密
$ivlen = openssl_cipher_iv_length($cipher = "AES-256-CBC");
$iv = openssl_random_pseudo_bytes($ivlen);
$encrypted = openssl_encrypt($payload, $cipher, $secretKey, OPENSSL_RAW_DATA, $iv);
// HMAC 签名(防篡改)
$hmac = hash_hmac('sha256', $iv . $encrypted, $secretKey, true);
// Base64 封装:IV|Encrypted|HMAC
return base64_encode($iv . $encrypted . $hmac);
}
// 示例调用
$license = generateLicense('example.com', 'MySuperSecretKey2024!');
echo $license;
?>
授权验证逻辑(客户端)
<?php
function verifyLicense($licenseData, $secretKey, $allowedDomain) {
$raw = base64_decode($licenseData);
if (!$raw || strlen($raw) < 64) return false;
$ivlen = openssl_cipher_iv_length('AES-256-CBC');
$iv = substr($raw, 0, $ivlen);
$hmacLen = 32;
$hmac = substr($raw, -$hmacLen);
$encrypted = substr($raw, $ivlen, -$hmacLen);
// 验证 HMAC
$expectedHmac = hash_hmac('sha256', $iv . $encrypted, $secretKey, true);
if (!hash_equals($hmac, $expectedHmac)) {
return false;
}
// 解密并解析
$decrypted = openssl_decrypt($encrypted, 'AES-256-CBC', $secretKey, OPENSSL_RAW_DATA, $iv);
if (!$decrypted) return false;
$data = json_decode($decrypted, true);
if (!$data || !isset($data['domain'], $data['expires_at'])) return false;
// 域名匹配 + 时间校验
if ($data['domain'] !== $allowedDomain || time() > $data['expires_at']) {
return false;
}
return true;
}
// 在系统入口处调用
if (!verifyLicense(file_get_contents('license.key'), 'MySuperSecretKey2024!', $_SERVER['HTTP_HOST'])) {
die('❌ 授权验证失败:许可证无效或已过期');
}
?>
⚠️ 安全提醒:实际生产中请将密钥存于环境变量或独立配置文件,切勿硬编码;建议结合服务器指纹(如MAC地址哈希)增强绑定强度;定期轮换密钥并记录授权日志。
该方案兼顾安全性与可维护性,无需数据库依赖,适用于中小规模PHP产品授权体系。关键在于——加密只是手段,可信的密钥管理和严谨的业务校验才是授权系统的灵魂。
```