PHP API 接口数据加密传输实现

```html PHP API 接口数据加密传输实现

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 数据传输的机密性与完整性。安全无小事,从一次加密开始筑牢防线。

```