php软件license实现
PHP 软件 License 实现方法
在 PHP 中实现软件 License 验证通常涉及生成、验证和管理许可证密钥。以下是几种常见的实现方式:
基于加密算法的 License 生成与验证
使用加密算法(如 AES、RSA)生成和验证 License 密钥:
// 生成 License 密钥
function generateLicense($data, $secretKey) {
$iv = openssl_random_pseudo_bytes(openssl_cipher_iv_length('aes-256-cbc'));
$encrypted = openssl_encrypt($data, 'aes-256-cbc', $secretKey, 0, $iv);
return base64_encode($iv . $encrypted);
}
// 验证 License 密钥
function validateLicense($license, $secretKey) {
$data = base64_decode($license);
$iv = substr($data, 0, openssl_cipher_iv_length('aes-256-cbc'));
$encrypted = substr($data, openssl_cipher_iv_length('aes-256-cbc'));
return openssl_decrypt($encrypted, 'aes-256-cbc', $secretKey, 0, $iv);
}
基于数字签名的 License 验证
使用公钥/私钥对 License 进行签名和验证:
// 生成签名
function signLicense($data, $privateKey) {
openssl_sign($data, $signature, $privateKey, OPENSSL_ALGO_SHA256);
return base64_encode($signature);
}
// 验证签名
function verifyLicense($data, $signature, $publicKey) {
$signature = base64_decode($signature);
return openssl_verify($data, $signature, $publicKey, OPENSSL_ALGO_SHA256) === 1;
}
基于时间限制的 License
实现有效期限制的 License:
function checkLicenseExpiry($licenseData) {
$currentTime = time();
$expiryTime = strtotime($licenseData['expiry_date']);
return $currentTime < $expiryTime;
}
基于硬件绑定的 License
将 License 与特定硬件信息绑定:
function getHardwareFingerprint() {
$mac = exec('getmac');
$cpu = exec('wmic cpu get ProcessorId');
return md5($mac . $cpu);
}
function validateHardware($licenseHardwareId) {
return $licenseHardwareId === getHardwareFingerprint();
}
完整的 License 验证流程示例
class LicenseManager {
private $publicKey = '...'; // 公钥
private $secretKey = '...'; // AES密钥
public function validate($licenseFile) {
$licenseData = json_decode(file_get_contents($licenseFile), true);
if (!$this->verifySignature($licenseData['data'], $licenseData['signature'])) {
return false;
}
$decryptedData = $this->decryptData($licenseData['data']);
$licenseInfo = json_decode($decryptedData, true);
if (!$this->checkExpiry($licenseInfo) || !$this->checkHardware($licenseInfo)) {
return false;
}
return $licenseInfo;
}
private function verifySignature($data, $signature) {
// 实现数字签名验证
}
private function decryptData($data) {
// 实现数据解密
}
private function checkExpiry($licenseInfo) {
// 检查有效期
}
private function checkHardware($licenseInfo) {
// 检查硬件绑定
}
}
云端 License 验证
实现与服务器通信的 License 验证:
function validateWithServer($licenseKey) {
$url = 'https://license.yourdomain.com/validate';
$data = ['license_key' => $licenseKey, 'hw_id' => getHardwareFingerprint()];
$options = [
'http' => [
'header' => "Content-type: application/x-www-form-urlencoded\r\n",
'method' => 'POST',
'content' => http_build_query($data)
]
];
$context = stream_context_create($options);
$result = file_get_contents($url, false, $context);
return json_decode($result, true)['valid'] ?? false;
}
License 文件结构示例
典型的 License 文件可能包含以下信息:
{
"license_key": "ENCryptedDATA...",
"customer": "Company Name",
"expiry_date": "2023-12-31",
"features": ["feature1", "feature2"],
"signature": "DIGITALsignature..."
}
这些方法可以单独使用或组合使用,具体取决于软件的安全需求和分发模式。对于商业软件,建议结合多种验证方式以提高安全性。







