
PHP+Vue实现前后端加密的轻量级方案
在现代Web开发中,前后端数据交互的安全性至关重要。为了防止数据在传输过程中被抓包篡改或窃听,除了依赖HTTPS协议外,在应用层增加一级加密防护是提升安全性的有效手段。本文将分享一套基于PHP与Vue的轻量级前后端加密方案,采用RSA与AES混合加密机制,兼顾安全性与性能。
核心设计思路
对称加密(AES)速度快,适合加密大体量业务数据;非对称加密(RSA)安全性高,但加密长度受限且耗时,适合加密短密钥。本方案结合两者优势:前端随机生成AES密钥与初始向量(IV)加密业务数据,再使用后端下发的RSA公钥加密该AES密钥与IV;后端接收请求后,先用RSA私钥解密出AES密钥与IV,再解密出真实业务数据。同时引入时间戳机制防止重放攻击。
前端实现 (Vue)
前端依赖 crypto-js 处理AES加密,依赖 jsencrypt 处理RSA加密。核心逻辑封装为加密拦截器,在请求发出前对数据进行处理。
import CryptoJS from 'crypto-js';
import JSEncrypt from 'jsencrypt';
// 生成指定长度的随机字符串
function generateRandomString(length) {
const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
let result = '';
for (let i = 0; i < length; i++) {
result += chars.charAt(Math.floor(Math.random() * chars.length));
}
return result;
}
// 混合加密函数
export function encryptPayload(data, rsaPublicKey) {
const aesKey = generateRandomString(32); // AES-256密钥
const aesIv = generateRandomString(16); // AES-CBC初始向量
const timestamp = Date.now();
// AES加密业务数据,附带时间戳防重放
const encryptedData = CryptoJS.AES.encrypt(
JSON.stringify({ ...data, timestamp }),
CryptoJS.enc.Utf8.parse(aesKey),
{ iv: CryptoJS.enc.Utf8.parse(aesIv), mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.Pkcs7 }
).toString();
// RSA公钥加密AES密钥和IV
const encryptor = new JSEncrypt();
encryptor.setPublicKey(rsaPublicKey);
const encryptedKey = encryptor.encrypt(aesKey);
const encryptedIv = encryptor.encrypt(aesIv);
return {
data: encryptedData,
key: encryptedKey,
iv: encryptedIv
};
}后端实现 (PHP)
后端使用 OpenSSL 扩展处理解密逻辑。首先通过RSA私钥解密获取AES密钥与IV,随后对业务密文进行AES解密,并校验时间戳的合理性。
class SecureService
{
private $privateKey;
public function __construct($privateKey)
{
$this->privateKey = "-----BEGIN PRIVATE KEY-----n" .
wordwrap($privateKey, 64, "n", true) .
"n-----END PRIVATE KEY-----";
}
// RSA私钥解密
private function rsaDecrypt($encryptedData)
{
openssl_private_decrypt(base64_decode($encryptedData), $decrypted, $this->privateKey);
return $decrypted;
}
// AES-CBC解密业务数据
public function decryptPayload($encryptedData, $encryptedKey, $encryptedIv)
{
$aesKey = $this->rsaDecrypt($encryptedKey);
$aesIv = $this->rsaDecrypt($encryptedIv);
if (!$aesKey || !$aesIv) {
throw new Exception('RSA解密失败');
}
$decrypted = openssl_decrypt(
base64_decode($encryptedData),
'AES-256-CBC',
$aesKey,
OPENSSL_RAW_DATA,
$aesIv
);
$data = json_decode($decrypted, true);
// 防重放攻击:校验时间戳,允许5秒误差
if (abs(time() * 1000 - $data['timestamp']) > 5000) {
throw new Exception('请求已过期');
}
return $data;
}
}方案总结
该方案通过RSA与AES的动态组合,规避了RSA加密数据量受限及AES密钥传输的安全隐患。每次请求均动态生成AES密钥,实现了“一次一密”的安全效果。配合时间戳校验,有效防御了重放攻击,在轻量级架构下提供了可靠的数据传输安全保障。