我将为您创建一个PHP加解密服务类,支持多种加密方式和场景:

<?php
/**
* 加解密服务类
* 支持AES、DES、RSA等常见加密算法
*/
class CryptoService
{
private $aesKey;
private $aesIv;
private $rsaPrivateKey;
private $rsaPublicKey;
/**
* 构造函数
*/
public function __construct(array $config = [])
{
$this->aesKey = $config['aes_key'] ?? 'default_aes_key_32bytes_long_123456';
$this->aesIv = $config['aes_iv'] ?? '1234567812345678';
$this->rsaPrivateKey = $config['rsa_private_key'] ?? null;
$this->rsaPublicKey = $config['rsa_public_key'] ?? null;
}
/**
* ==================== AES 加解密 ====================
*/
/**
* AES-256-CBC 加密
* @param string $data 待加密数据
* @param string $key 密钥(32字节)
* @param string $iv 初始化向量(16字节)
* @return string Base64编码的密文
*/
public function aesEncrypt($data, $key = null, $iv = null)
{
$key = $key ?? $this->aesKey;
$iv = $iv ?? $this->aesIv;
// 确保密钥长度正确
$key = substr(hash('sha256', $key, true), 0, 32);
$iv = substr($iv, 0, 16);
$encrypted = openssl_encrypt(
$data,
'AES-256-CBC',
$key,
OPENSSL_RAW_DATA,
$iv
);
if ($encrypted === false) {
throw new Exception('AES加密失败: ' . openssl_error_string());
}
return base64_encode($encrypted);
}
/**
* AES-256-CBC 解密
*/
public function aesDecrypt($encryptedData, $key = null, $iv = null)
{
$key = $key ?? $this->aesKey;
$iv = $iv ?? $this->aesIv;
$key = substr(hash('sha256', $key, true), 0, 32);
$iv = substr($iv, 0, 16);
$decrypted = openssl_decrypt(
base64_decode($encryptedData),
'AES-256-CBC',
$key,
OPENSSL_RAW_DATA,
$iv
);
if ($decrypted === false) {
throw new Exception('AES解密失败: ' . openssl_error_string());
}
return $decrypted;
}
/**
* AES-GCM 加密(认证加密)
*/
public function aesGcmEncrypt($data, $key = null, $aad = '')
{
$key = $key ?? $this->aesKey;
$key = substr(hash('sha256', $key, true), 0, 32);
$iv = random_bytes(12); // GCM推荐12字节IV
$tag = '';
$encrypted = openssl_encrypt(
$data,
'aes-256-gcm',
$key,
OPENSSL_RAW_DATA,
$iv,
$tag,
$aad,
16
);
if ($encrypted === false) {
throw new Exception('AES-GCM加密失败');
}
// 返回 iv + tag + 密文
return base64_encode($iv . $tag . $encrypted);
}
/**
* AES-GCM 解密
*/
public function aesGcmDecrypt($encryptedData, $key = null, $aad = '')
{
$key = $key ?? $this->aesKey;
$key = substr(hash('sha256', $key, true), 0, 32);
$data = base64_decode($encryptedData);
$iv = substr($data, 0, 12);
$tag = substr($data, 12, 16);
$ciphertext = substr($data, 28);
$decrypted = openssl_decrypt(
$ciphertext,
'aes-256-gcm',
$key,
OPENSSL_RAW_DATA,
$iv,
$tag,
$aad
);
if ($decrypted === false) {
throw new Exception('AES-GCM解密失败');
}
return $decrypted;
}
/**
* ==================== RSA 加解密 ====================
*/
/**
* RSA 公钥加密
*/
public function rsaEncrypt($data, $publicKey = null)
{
$publicKey = $publicKey ?? $this->rsaPublicKey;
if (!$publicKey) {
throw new Exception('缺少RSA公钥');
}
$publicKeyResource = openssl_pkey_get_public($publicKey);
if (!$publicKeyResource) {
throw new Exception('无效的RSA公钥');
}
$encrypted = '';
// 分段加密(RSA最大加密长度为密钥长度/8 - 11)
$keyLength = openssl_pkey_get_details($publicKeyResource)['bits'] / 8;
$maxLength = $keyLength - 11;
$dataLength = strlen($data);
for ($i = 0; $i < $dataLength; $i += $maxLength) {
$chunk = substr($data, $i, $maxLength);
$encryptedChunk = '';
if (!openssl_public_encrypt($chunk, $encryptedChunk, $publicKeyResource)) {
throw new Exception('RSA加密失败');
}
$encrypted .= $encryptedChunk;
}
return base64_encode($encrypted);
}
/**
* RSA 私钥解密
*/
public function rsaDecrypt($encryptedData, $privateKey = null)
{
$privateKey = $privateKey ?? $this->rsaPrivateKey;
if (!$privateKey) {
throw new Exception('缺少RSA私钥');
}
$privateKeyResource = openssl_pkey_get_private($privateKey);
if (!$privateKeyResource) {
throw new Exception('无效的RSA私钥');
}
$data = base64_decode($encryptedData);
$keyLength = openssl_pkey_get_details($privateKeyResource)['bits'] / 8;
$decrypted = '';
$dataLength = strlen($data);
for ($i = 0; $i < $dataLength; $i += $keyLength) {
$chunk = substr($data, $i, $keyLength);
$decryptedChunk = '';
if (!openssl_private_decrypt($chunk, $decryptedChunk, $privateKeyResource)) {
throw new Exception('RSA解密失败');
}
$decrypted .= $decryptedChunk;
}
return $decrypted;
}
/**
* ==================== 其他加密方法 ====================
*/
/**
* 生成密码哈希
*/
public function hashPassword($password)
{
return password_hash($password, PASSWORD_BCRYPT, ['cost' => 12]);
}
/**
* 验证密码
*/
public function verifyPassword($password, $hash)
{
return password_verify($password, $hash);
}
/**
* HMAC-SHA256签名
*/
public function hmacSign($data, $key = null)
{
$key = $key ?? $this->aesKey;
return base64_encode(hash_hmac('sha256', $data, $key, true));
}
/**
* HMAC验证
*/
public function hmacVerify($data, $signature, $key = null)
{
$expected = $this->hmacSign($data, $key);
return hash_equals($expected, $signature);
}
/**
* 生成加密的唯一ID
*/
public function generateEncryptedId($id)
{
return $this->aesEncrypt((string)$id);
}
/**
* 解密ID
*/
public function decryptId($encryptedId)
{
return (int)$this->aesDecrypt($encryptedId);
}
/**
* ==================== 工具方法 ====================
*/
/**
* 生成随机密钥
*/
public static function generateRandomKey($length = 32)
{
return bin2hex(random_bytes($length / 2));
}
/**
* 生成RSA密钥对
*/
public static function generateRsaKeyPair($bits = 2048)
{
$config = [
'private_key_bits' => $bits,
'private_key_type' => OPENSSL_KEYTYPE_RSA,
];
$resource = openssl_pkey_new($config);
openssl_pkey_export($resource, $privateKey);
$publicKey = openssl_pkey_get_details($resource);
return [
'private_key' => $privateKey,
'public_key' => $publicKey['key']
];
}
/**
* URL安全的base64编码
*/
public function base64UrlEncode($data)
{
return rtrim(strtr(base64_encode($data), '+/', '-_'), '=');
}
/**
* URL安全的base64解码
*/
public function base64UrlDecode($data)
{
return base64_decode(strtr($data, '-_', '+/'));
}
/**
* 数据签名(包含时间戳防重放)
*/
public function signWithTimestamp($data)
{
$timestamp = time();
$signData = $timestamp . ':' . $data;
$signature = $this->hmacSign($signData);
return [
'data' => $data,
'timestamp' => $timestamp,
'signature' => $signature
];
}
/**
* 验证带时间戳的签名
*/
public function verifyTimestampSign($data, $timestamp, $signature, $timeWindow = 300)
{
// 检查时间戳是否在有效窗口内
if (abs(time() - $timestamp) > $timeWindow) {
return false;
}
return $this->hmacVerify($timestamp . ':' . $data, $signature);
}
}
使用示例:
<?php
// 加载类
require_once 'CryptoService.php';
// 初始化服务
$cryptoService = new CryptoService([
'aes_key' => 'your-32-character-secret-key',
'aes_iv' => '16-character-iv',
'rsa_private_key' => file_get_contents('private.pem'),
'rsa_public_key' => file_get_contents('public.pem')
]);
// AES加密示例
try {
$data = '需要加密的敏感数据';
// AES-CBC加密
$encrypted = $cryptoService->aesEncrypt($data);
echo "AES加密结果: " . $encrypted . "\n";
echo "AES解密结果: " . $cryptoService->aesDecrypt($encrypted) . "\n";
// AES-GCM加密(更安全)
$encryptedGcm = $cryptoService->aesGcmEncrypt($data);
echo "AES-GCM加密: " . $encryptedGcm . "\n";
echo "AES-GCM解密: " . $cryptoService->aesGcmDecrypt($encryptedGcm) . "\n";
// RSA加密
$rsaEncrypted = $cryptoService->rsaEncrypt($data);
echo "RSA加密: " . $rsaEncrypted . "\n";
echo "RSA解密: " . $cryptoService->rsaDecrypt($rsaEncrypted) . "\n";
// 密码哈希
$passwordHash = $cryptoService->hashPassword('user_password');
echo "密码验证: " . var_export($cryptoService->verifyPassword('user_password', $passwordHash), true) . "\n";
// HMAC签名
$signature = $cryptoService->hmacSign('要签名的数据');
echo "HMAC验证: " . var_export($cryptoService->hmacVerify('要签名的数据', $signature), true) . "\n";
} catch (Exception $e) {
echo "错误: " . $e->getMessage() . "\n";
}
主要特性:
- AES对称加密:支持CBC和GCM模式,GCM模式提供认证加密
- RSA非对称加密:支持公钥加密、私钥解密
- 密码安全:使用bcrypt算法进行密码哈希
- 数据完整性:提供HMAC签名验证
- 安全工具:时间戳防重放、URL安全编码等
这个服务类适合在PHP项目中使用,可以根据实际需求进行扩展或修改。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播