Dio请求加密策略:对称加密与非对称加密选择

Dio请求加密策略:对称加密与非对称加密选择

【免费下载链接】dio A powerful HTTP client for Dart and Flutter, which supports global settings, Interceptors, FormData, aborting and canceling a request, files uploading and downloading, requests timeout, custom adapters, etc. 【免费下载链接】dio 项目地址: https://gitcode.com/gh_mirrors/di/dio

在移动应用开发中,网络请求的安全性至关重要。本文将深入探讨如何在Dio(一个功能强大的Dart和Flutter HTTP客户端)中实现请求加密,重点分析对称加密与非对称加密的适用场景及实现方式,并提供完整的代码示例帮助开发者快速上手。

加密策略概览

Dio作为支持拦截器(Interceptors)、全局配置和自定义适配器的HTTP客户端,为请求加密提供了灵活的实现途径。根据加密层级不同,可分为传输层加密和应用层加密两类:

  • 传输层加密:通过SSL/TLS协议(HTTPS)实现,Dio默认支持并可通过证书固定(Certificate Pinning)增强安全性
  • 应用层加密:在请求发送前对数据进行加密处理,接收后解密,主要包括对称加密(如AES)和非对称加密(如RSA)

加密方式对比

加密类型性能密钥管理适用场景Dio实现方式
对称加密(AES)复杂大量数据传输拦截器处理
非对称加密(RSA)简单密钥交换、签名验证自定义转换器
SSL/TLS自动基础传输安全证书固定

传输层加密:证书固定实现

Dio通过证书固定(Certificate Pinning)机制防止中间人攻击,确保客户端只与指定服务器建立连接。以下是基于Dio实现证书固定的完整示例:

import 'dart:io';
import 'package:crypto/crypto.dart';
import 'package:dio/dio.dart';
import 'package:dio/io.dart';

void main() async {
  final dio = Dio();
  
  // 服务器证书SHA256指纹(需替换为实际证书指纹)
  final fingerprint = 'ee5ce1dfa7a53657c545c62b65802e4272878dabd65c0aadcf85783ebb0b4d5c';
  
  dio.httpClientAdapter = IOHttpClientAdapter(
    createHttpClient: () {
      final client = HttpClient(
        context: SecurityContext(withTrustedRoots: false),
      );
      client.badCertificateCallback = (cert, host, port) => true;
      return client;
    },
    validateCertificate: (cert, host, port) {
      if (cert == null) return false;
      // 验证证书指纹
      final certFingerprint = sha256.convert(cert.der).toString();
      return fingerprint == certFingerprint;
    },
  );
  
  try {
    final response = await dio.get('https://api.example.com/secure-data');
    print('请求成功: ${response.data}');
  } on DioException catch (e) {
    print('请求失败: ${e.message}');
  }
}

上述代码通过validateCertificate回调验证服务器证书指纹,确保只有指纹匹配的服务器才能建立连接。实际应用中,需使用openssl命令获取服务器证书指纹:

openssl s_client -servername example.com -connect example.com:443 < /dev/null 2>/dev/null | openssl x509 -noout -fingerprint -sha256

Dio的证书固定实现位于example_dart/lib/certificate_pinning.dart,可作为实际项目参考。

应用层加密:对称加密(AES)实现

AES对称加密适用于大量数据传输场景,Dio通过拦截器实现请求/响应的自动加解密处理:

AES加密拦截器

import 'dart:convert';
import 'package:dio/dio.dart';
import 'package:encrypt/encrypt.dart';

class AesInterceptor extends Interceptor {
  final String key; // 16/24/32字节密钥
  final String iv;  // 16字节初始化向量
  
  late final Encrypter _encrypter;
  late final IV _iv;
  
  AesInterceptor({required this.key, required this.iv}) {
    _iv = IV.fromUtf8(iv);
    _encrypter = Encrypter(AES(Key.fromUtf8(key), mode: AESMode.cbc));
  }
  
  @override
  void onRequest(RequestOptions options, RequestInterceptorHandler handler) {
    if (options.data != null && options.contentType?.contains('application/json') == true) {
      // 请求数据加密
      final encrypted = _encrypter.encrypt(json.encode(options.data), iv: _iv);
      options.data = {'data': encrypted.base64};
    }
    super.onRequest(options, handler);
  }
  
  @override
  void onResponse(Response response, ResponseInterceptorHandler handler) {
    if (response.data != null && response.headers['content-type']?.contains('application/json') == true) {
      // 响应数据解密
      final decrypted = _encrypter.decrypt64(response.data['data'], iv: _iv);
      response.data = json.decode(decrypted);
    }
    super.onResponse(response, handler);
  }
}

// 使用示例
void setupAesDio() {
  final dio = Dio();
  // 添加AES拦截器(密钥需安全存储,勿硬编码)
  dio.interceptors.add(AesInterceptor(
    key: 'your-32-byte-secret-key-here', // 32字节密钥(AES-256)
    iv: 'your-16-byte-iv-here',         // 16字节IV
  ));
}

密钥安全管理

对称加密的密钥安全至关重要,推荐通过以下方式管理密钥:

  1. 安全存储:使用Flutter Secure Storage等插件存储密钥
  2. 动态获取:通过安全渠道(如非对称加密)动态获取密钥
  3. 定期轮换:实现密钥自动轮换机制,降低泄露风险

应用层加密:非对称加密实现

RSA非对称加密适用于安全传输小量数据(如对称密钥),Dio可通过自定义转换器实现请求/响应的RSA加解密:

RSA加密转换器

import 'dart:convert';
import 'package:dio/dio.dart';
import 'package:pointycastle/pointycastle.dart';
import 'package:pointycastle/random/fortuna_random.dart';
import 'dart:typed_data';

class RsaTransformer extends DefaultTransformer {
  final String publicKey; // 公钥字符串
  
  RsaTransformer({required this.publicKey});
  
  @override
  Future<String> transformRequest(RequestOptions options) async {
    if (options.data != null) {
      // 使用公钥加密请求数据
      final publicKey = RSAKeyParser().parse(publicKey) as RSAPublicKey;
      final cipher = Cipher('RSA/OAEP');
      cipher.init(true, PublicKeyParameter<RSAPublicKey>(publicKey));
      
      final dataBytes = utf8.encode(json.encode(options.data));
      final encryptedBytes = cipher.process(Uint8List.fromList(dataBytes));
      
      return base64.encode(encryptedBytes);
    }
    return super.transformRequest(options);
  }
}

// 使用示例
void setupRsaDio() {
  final dio = Dio();
  // 设置RSA转换器
  dio.transformer = RsaTransformer(
    publicKey: '''-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAx48sQjKZ6j5xH5Q5QZ6j5
xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5
QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5
xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5
QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5
xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5
QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5
xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5
QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5
xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5
QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5
xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5
QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5
xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5
QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5
xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5
QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5
xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5
QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5
xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5
QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5
xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5
QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5
xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5
QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5
xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5
QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5
xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5
QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5
xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5
QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5
xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5
QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5
xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5
QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5
xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5
QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5
xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5
QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5
xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5
QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5
xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5
QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5
xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5
QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5
xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5
QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5
xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5
QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5
xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5
QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5
xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5
QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5
xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5
QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5
xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5
QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5
xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5
QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5
xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5
QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5
xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5
QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5
xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5
QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5
xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5
QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5
xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5
QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5
xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5
QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5
xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5
QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5
xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5
QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5
xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5
QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5
xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5
QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5
xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5
QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5
xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5
QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5
xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5
QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5
xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5
QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5
xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5
QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5
xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5
QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5
xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5
QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5
xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5
QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5
xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5
QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5
xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5
QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5
xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5
QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5
xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5
QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5
xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5
QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5
xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5
QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5
xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5
QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5
xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5
QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5
xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5
QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5
xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5
QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5
xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5
QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5
xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5
QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5
xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5
QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5
xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5
QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5
xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5
QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5
xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5
QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5
xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5
QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5
xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5
QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5
xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5
QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5
xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5
QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5
xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5
QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5
xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5
QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5
xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5
QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5
xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5
QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5
xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5
QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5
xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5
QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5
xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5
QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5
xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5
QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5
xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5
QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5
xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5
QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5
xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5
QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5
xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5
QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5
xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5
QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5
xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5
QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5
xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5
QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5
xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5
QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5
xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5
QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5
xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5
QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5
xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5
QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5
xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5
QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5
xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5
QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5
xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5
QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5
xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5
QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5
xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5
QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5
xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5
QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5
xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5
QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5
xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5
QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5
xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5
QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5
xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5
QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5
xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5
QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5
xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5
QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5
xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5
QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5
xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5
QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5
xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5
QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5
xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5
QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5
xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5
QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5
xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5
QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5
xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5
QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5
xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5
QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5
xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5
QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5
xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5
QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5
xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5
QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5
xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5
QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5
xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5
QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5
xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5
QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5
xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5
QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5
xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5
QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5
xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5
QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5
xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5
QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5
xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5
QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5
xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5
QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5
xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5
QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5
xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5
QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5
xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5
QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5
xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5
QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5
xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5
QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5
xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5
QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5
xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5
QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5
xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5
QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5
xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5
QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5
xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5
QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5
xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5
QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5
xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5
QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5
xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5
QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5
xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5
QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5
xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5
QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5
xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5
QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5
xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5
QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5
xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5
QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5
xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5
QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5
xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5
QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5
xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5
QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5
xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5
QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5
xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5
QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5
xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5
QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5
xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5
QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5
xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5
QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5
xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5
QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5
xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5
QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5
xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5
QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5
xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5
QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5
xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5
QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5
xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5
QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5
xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5
QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5
xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5
QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5
xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5
QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5
xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5
QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5
xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5
QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5
xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5
QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5
xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5
QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5
xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5
QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5
xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5
QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5
xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5
QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5
xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5
QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5
xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5
QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5
xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5
QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5
xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5
QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5
xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5
QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5
xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5
QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5
xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5
QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5
xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5
QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5
xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5
QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5
xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5
QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5
xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5
QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5
xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5
QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5
xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5
QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5
xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5QZ6j5xH5Q5''');
  
  // 发送加密请求
  final response = await dio.post('https://api.example.com/secure-data',
    data: {'sensitive_info': '需要加密的数据'});
}

混合加密方案

实际项目中,推荐采用"非对称加密+对称加密"的混合方案:

  1. 使用RSA加密传输AES密钥
  2. 使用AES加密实际业务数据
  3. 通过Dio拦截器统一处理加解密流程
// 混合加密拦截器实现示例
class HybridEncryptionInterceptor extends Interceptor {
  final String publicKey; // RSA公钥
  
  HybridEncryptionInterceptor({required this.publicKey});
  
  @override
  void onRequest(RequestOptions options, RequestInterceptorHandler handler) async {
    // 生成随机AES密钥
    final aesKey = _generateRandomAesKey();
    final iv = _generateRandomIV();
    
    // 使用AES加密请求数据
    final aesEncrypter = Encrypter(AES(Key.fromUtf8(aesKey), mode: AESMode.cbc));
    final encryptedData = aesEncrypter.encrypt(json.encode(options.data), iv: IV.fromUtf8(iv));
    
    // 使用RSA加密AES密钥
    final rsaEncrypter = Encrypter(RSA(publicKey: publicKey));
    final encryptedAesKey = rsaEncrypter.encrypt(aesKey);
    final encryptedIV = rsaEncrypter.encrypt(iv);
    
    // 构建请求数据
    options.data = {
      'encrypted_key': encryptedAesKey.base64,
      'encrypted_iv': encryptedIV.base64,
      'data': encryptedData.base64
    };
    
    super.onRequest(options, handler);
  }
  
  // 生成随机AES密钥
  String _generateRandomAesKey() {
    final random = FortunaRandom();
    random.seed(KeyParameter(Uint8List(32)));
    final keyBytes = random.nextBytes(32); // 32字节=256位
    return base64.encode(keyBytes);
  }
  
  // 生成随机IV
  String _generateRandomIV() {
    final random = FortunaRandom();
    random.seed(KeyParameter(Uint8List(16)));
    final ivBytes = random.nextBytes(16); // 16字节IV
    return base64.encode(ivBytes);
  }
}

加密方案选择指南

场景化加密策略

根据不同的业务场景选择合适的加密方案:

  1. 用户登录:RSA加密密码 + SSL传输
  2. 数据同步:AES加密数据 + RSA加密AES密钥
  3. 文件上传:分块AES加密 + 校验和验证
  4. 支付请求:RSA签名 + 时间戳防重放

性能优化建议

  • 对称加密:使用AES-256-CBC模式,块大小128位
  • 非对称加密:RSA密钥长度2048位,配合OAEP填充
  • 数据压缩:加密前压缩数据,减少加密计算量
  • 密钥缓存:合理缓存AES密钥,减少RSA加解密次数

总结与最佳实践

Dio提供了灵活的扩展机制实现请求加密,开发者应根据实际需求选择合适的加密策略:

  1. 基础安全:始终启用SSL/TLS,配合证书固定防止中间人攻击
  2. 密钥管理:对称密钥需安全存储,避免硬编码
  3. 性能平衡:大量数据传输优先使用AES,关键信息使用RSA签名
  4. 代码实现:通过拦截器统一处理加密逻辑,保持业务代码清晰

Dio官方示例提供了完整的加密实现参考,包括:

通过合理组合使用对称加密、非对称加密和传输层加密,可构建安全可靠的Dio网络请求体系,有效保护用户数据安全。

【免费下载链接】dio A powerful HTTP client for Dart and Flutter, which supports global settings, Interceptors, FormData, aborting and canceling a request, files uploading and downloading, requests timeout, custom adapters, etc. 【免费下载链接】dio 项目地址: https://gitcode.com/gh_mirrors/di/dio

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值