PHP加密授权源码解析与应用

```html PHP加密授权源码解析与应用

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产品授权体系。关键在于——加密只是手段,可信的密钥管理和严谨的业务校验才是授权系统的灵魂。

```