如何在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
相关产品推荐
相关产品推荐

