PHP API 接口数据加密传输实现
在构建 Web API 时,保障敏感数据(如用户凭证、订单信息)的安全传输至关重要。单纯依赖 HTTPS 虽能防窃听,但无法防止重放攻击或中间人篡改请求体。本文介绍一种轻量、实用的 PHP 端对端加密方案:使用 AES-256-CBC 对请求/响应 JSON 数据加密,并结合 HMAC 签名与时间戳验证,提升接口安全性。
核心思路
- 客户端:生成随机 IV → AES 加密明文 → 计算 HMAC-SHA256 签名 → 拼装为 JSON 发送
- 服务端:校验时间戳(±5 分钟)→ 验证 HMAC → 解密数据 → 处理业务逻辑
- 密钥(
$secretKey)由前后端安全约定,不通过网络传输
服务端解密与验签示例(PHP)
<?php
function decryptApiRequest($rawBody, $secretKey): ?array {
$data = json_decode($rawBody, true);
if (!$data || !isset($data['iv'], $data['ciphertext'], $data['signature'], $data['timestamp'])) {
return null;
}
// 1. 时间戳防重放(5分钟窗口)
if (abs(time() - (int)$data['timestamp']) > 300) {
return null;
}
// 2. HMAC 验证完整性
$hmac = hash_hmac('sha256', $data['iv'] . $data['ciphertext'] . $data['timestamp'], $secretKey);
if (!hash_equals($hmac, $data['signature'])) {
return null;
}
// 3. AES 解密
$iv = base64_decode($data['iv']);
$ciphertext = base64_decode($data['ciphertext']);
$decrypted = openssl_decrypt($ciphertext, 'AES-256-CBC', $secretKey, OPENSSL_RAW_DATA, $iv);
return $decrypted ? json_decode($decrypted, true) : null;
}
// 使用示例
$secretKey = 'your_32_byte_secret_key_here_12345678'; // 必须为32字节
$requestBody = file_get_contents('php://input');
$payload = decryptApiRequest($requestBody, $secretKey);
if ($payload === null) {
http_response_code(400);
echo json_encode(['error' => 'Invalid or expired request']);
} else {
// ✅ 安全解密成功,处理业务逻辑
echo json_encode(['status' => 'success', 'data' => $payload]);
}
?>
客户端加密参考(JavaScript 简化示意)
前端可使用 crypto-js 实现对称加密:
// const CryptoJS = require('crypto-js');
const iv = CryptoJS.lib.WordArray.random(16);
const key = CryptoJS.enc.Utf8.parse(secretKey);
const encrypted = CryptoJS.AES.encrypt(JSON.stringify(payload), key, {
iv: iv,
mode: CryptoJS.mode.CBC,
padding: CryptoJS.pad.Pkcs7
});
const signature = CryptoJS.HmacSHA256(iv.toString() + encrypted.toString() + timestamp, secretKey).toString();
⚠️ 注意事项:
- 密钥需严格保密,建议通过环境变量加载(
$_ENV['API_SECRET']) - 生产环境务必启用 HTTPS;本方案是 HTTPS 的增强,非替代
- IV 必须每次随机生成,不可复用;签名需包含 IV + 密文 + 时间戳以防止篡改
- 敏感字段(如密码)仍应在业务层二次哈希,加密传输 ≠ 数据脱敏
通过以上方式,开发者可在不引入复杂证书体系的前提下,显著提升 API 数据传输的机密性与完整性。安全无小事,从一次加密开始筑牢防线。
```