PHP API 接口数据加密传输实现
在构建 Web API 时,保障敏感数据(如用户凭证、订单信息)的安全传输至关重要。单纯依赖 HTTPS 虽能防窃听,但无法防止重放攻击或中间人篡改请求体。本文介绍一种轻量、实用的 PHP 端对端加密方案:使用 AES-256-CBC 对请求/响应 JSON 数据加密,并结合 HMAC 签名与时间戳验证,提升接口安全性。
核心思路
- 客户端:生成随机 IV → AES 加密明文 → 计算 HMAC-SHA256 签名 → 拼装为 JSON(
{"data": "...", "sign": "...", "ts": 171...})→ 发送 - 服务端:校验时间戳(±5 分钟)→ 解密 data → 验证签名 → 处理业务逻辑
服务端解密与验签示例(PHP)
<?php
class ApiCrypto {
private const KEY = 'your_32_byte_secret_key_here_12345678'; // 必须严格保密!建议从环境变量读取
private const IV_LENGTH = 16;
public static function decryptRequest(string $rawBody): ?array {
$payload = json_decode($rawBody, true);
if (!$payload || !isset($payload['data'], $payload['sign'], $payload['ts'])) {
return null;
}
// 时间戳防重放(±5分钟)
if (abs(time() - (int)$payload['ts']) > 300) {
return null;
}
// 验证签名
$expectedSign = hash_hmac('sha256', $payload['data'] . $payload['ts'], self::KEY);
if (!hash_equals($expectedSign, $payload['sign'])) {
return null;
}
// AES 解密
$ciphertext = base64_decode($payload['data']);
if (strlen($ciphertext) < self::IV_LENGTH) return null;
$iv = substr($ciphertext, 0, self::IV_LENGTH);
$encrypted = substr($ciphertext, self::IV_LENGTH);
$decrypted = openssl_decrypt($encrypted, 'AES-256-CBC', self::KEY, OPENSSL_RAW_DATA, $iv);
return $decrypted ? json_decode($decrypted, true) : null;
}
}
// 使用示例
$rawInput = file_get_contents('php://input');
$data = ApiCrypto::decryptRequest($rawInput);
if ($data === null) {
http_response_code(400);
echo json_encode(['error' => 'Invalid or expired request']);
} else {
// ✅ 安全解密成功,处理业务逻辑
echo json_encode(['status' => 'success', 'user_id' => $data['user_id']]);
}
?>
安全提示:
- 密钥
KEY必须通过$_ENV或配置中心管理,严禁硬编码 - 生产环境务必启用 HTTPS,否则加密无意义
- 建议配合 API 网关做限流、IP 白名单及请求频率控制
- 敏感操作(如支付)应叠加二次验证(如短信/邮箱验证码)
该方案平衡了安全性与开发效率,无需引入复杂框架即可快速落地。对于更高安全要求场景(如金融级),可升级为非对称加密(RSA/AES 混合)或集成 JWT + OAuth2.0。记住:安全是纵深防御体系,加密只是其中一环——代码审计、最小权限原则与持续监控同样关键。
```