You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Flutter Web客户端加密POST请求体并在PHP后端解密

Flutter Web 请求体加密与PHP后端解密实现方案

要实现请求体加密传输并防止篡改,推荐使用AES-GCM对称加密算法——它同时提供加密功能和数据完整性校验,能有效防止数据被篡改或伪造。以下是具体实现步骤:

Flutter Web 端实现

首先添加依赖:在pubspec.yaml中加入encrypt包用于加密操作:

dependencies:
  encrypt: ^5.0.1

然后编写加密并发送请求的代码:

import 'dart:convert';
import 'package:encrypt/encrypt.dart';
import 'package:http/http.dart' as http;

Future<void> sendEncryptedRequest() async {
  // 原始业务数据
  final rawData = {
    "name": "amir abbas",
    "user_name": "amir_a14",
  };
  // 将Map序列化为JSON字符串
  final jsonStr = json.encode(rawData);

  // 注意:以下密钥仅为示例,实际项目禁止硬编码!
  // 推荐通过用户登录后的后端接口动态获取临时密钥
  final secretKey = Key.fromUtf8('your-32-char-secure-secret-key'); // AES-256需要32位密钥
  // 生成12字节随机IV(GCM模式推荐长度)
  final iv = IV.fromSecureRandom(12);

  // 初始化AES-GCM加密器
  final encrypter = Encrypter(AES(secretKey, mode: AESMode.gcm));
  // 加密数据,得到包含密文和认证标签的结果
  final encryptedResult = encrypter.encrypt(jsonStr, iv: iv);

  // 构造请求体:将IV、密文、认证标签转为Base64编码后发送
  final requestBody = {
    'iv': iv.base64,
    'encrypted_data': encryptedResult.base64,
    'auth_tag': encryptedResult.authTag!.base64,
  };

  // 发送POST请求
  final url = Uri.parse('https://my-domain.test/myApi.php');
  final response = await http.post(url, body: requestBody);

  // 处理后端响应
  if (response.statusCode == 200) {
    print('请求成功:${response.body}');
  } else {
    print('请求失败,状态码:${response.statusCode}');
  }
}

PHP 后端实现

编写myApi.php处理解密逻辑:

<?php
// 与Flutter端一致的密钥(注意:生产环境需通过安全配置管理,不要硬编码)
$secretKey = 'your-32-char-secure-secret-key';

// 接收前端提交的加密数据
$iv = base64_decode($_POST['iv']);
$encryptedData = base64_decode($_POST['encrypted_data']);
$authTag = base64_decode($_POST['auth_tag']);

try {
    // 使用AES-256-GCM解密并验证数据完整性
    $decrypted = openssl_decrypt(
        $encryptedData,
        'aes-256-gcm',
        $secretKey,
        OPENSSL_RAW_DATA,
        $iv,
        $authTag
    );

    if ($decrypted === false) {
        throw new Exception('解密失败,数据可能被篡改或密钥不匹配');
    }

    // 解析JSON为数组
    $data = json_decode($decrypted, true);
    // 这里可以添加业务逻辑,比如存储数据、返回结果等
    echo json_encode([
        'status' => 'success',
        'received_data' => $data
    ]);
} catch (Exception $e) {
    echo json_encode([
        'status' => 'error',
        'message' => $e->getMessage()
    ]);
}
?>

关键安全注意事项

  • 密钥安全:绝对不能在Flutter Web代码中硬编码密钥(Web代码可被用户直接查看)。建议用户登录后,后端返回临时对称密钥(带过期时间),每次会话使用独立密钥。
  • 强制使用HTTPS:加密后的请求体虽能防篡改,但HTTP传输会导致密文被窃听,HTTPS可保障传输通道的安全性。
  • IV必须随机:每次请求生成新的随机IV,禁止重复使用同一IV与密钥组合,否则会降低加密安全性。
  • 认证标签必验:后端必须验证GCM的认证标签,一旦验证失败,直接拒绝请求——这是防止数据篡改的核心。
  • 防重放攻击:可在原始数据中加入随机nonce或时间戳,后端记录已使用的nonce,防止攻击者重复发送加密后的请求。

内容的提问来源于stack exchange,提问作者amir_a14

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 18:10:36