Flutter开发网络请求中对数据加密解密

背景介绍

在Flutter开发中,处于安全考虑,可能需要将请求数据加密处理后再传输,今天我们就介绍下Flutter种如何进行加解密,和如何将加解密应用到网络请求中,正文开始

引入加密库

encrypt: ^5.0.3

使用加密函数进行加密

AES加密

import 'package:encrypt/encrypt.dart' as ECP;
import 'package:encrypt/encrypt.dart';

  ///AES加密
  String _aesEncrypted(String aesKey, String ivKey, String text) {
    print("aes加密,原文:$text");
    final key = ECP.Key.fromUtf8(aesKey);
    final iv = ECP.IV.fromUtf8(ivKey);
    final encrypter = ECP.Encrypter(ECP.AES(key, mode: ECP.AESMode.cbc, padding: "PKCS7"));
    final encrypted = encrypter.encrypt(text, iv: iv);
    print("aes加密${encrypted.base64}"); 
    return encrypted.base64;
  }

AES解密

  ///AES解密
  String _aesDecrypted(String aesKey, String ivKey, String text) {
    try {
      final key = ECP.Key.fromUtf8(aesKey);
      final encrypter = Encrypter(AES(key, mode: AESMode.cbc));
      String decrypt64 = encrypter.decrypt64(text, iv: IV.fromUtf8(ivKey));
      print("aes decode :$decrypt64");
      return decrypt64;
    } catch (err) {
      print("aes decode error:$err");
      return "base64";
    }
  }

此时可能会好奇,加密用的key和向量从哪来,这时候你可能需要了解下AES加密的原理,因为AES是对称加密,需要和服务端约定好加密的key和向量,一般安全起见是通过服务器动态下发。

RSA加密

///使用rsa加密数据
  String _rsaEncrypt(String text)  {
    try {
      RSAAsymmetricKey publicKey = RSAKeyParser().parse(publicKeyString);
      RSAPublicKey? key = publicKey as RSAPublicKey?;
      //创建加密器
      final encrypter = Encrypter(RSA(publicKey: key));

      print("rsa加密 ${encrypter.encrypt(text).base64}");
      return encrypter.encrypt(text).base64;
    } catch (err) {
      return err.toString();
    }
  }

RSA解密(RSA是非对称加密算法,解密需要私钥,这里只是模拟)

  ///使用rsa解密
  Future<String> _rsaDecrypt(String privateKey,String text) async {
    String privateKeyString = "-----BEGIN PUBLIC KEY-----\n"
        "$privateKey"
        "\n-----END PUBLIC KEY-----";
    try {
      RSAAsymmetricKey privateKey = RSAKeyParser().parse(privateKeyString);
      RSAPrivateKey? key = privateKey as RSAPrivateKey?;
      //创建加密器
      final decrypter = Encrypter(RSA(privateKey: key));

      print(decrypter.decrypt(Encrypted.from64(text)));
      return decrypter.decrypt(Encrypted.fromBase64(text));
    } catch (err) {
      return err.toString();
    }
  }

Flutter的网络请求时如何使用

重头戏来了,加密一般用在数据传输,移动端APP与服务器交互中的数据安全就需要用到了,我在这里模拟一个网络请求,需要将参数和请求头进行加密

 _https() async {
    //思路
    //1.先生成128位的key和向量
    String aesKey = _creatRandomStr(128);
    String ivKey = _creatRandomStr(128);
    //4.请求body参数AES加密
    
    

    var url = "http://www.test.com";
    var params = {"token": "xxx", "id": "111"};
    String jsonString = jsonEncode(params);

    Dio dio = new Dio();
    dio.options.contentType = "application/json";

    ///请求header的配置,aes_key+aes_iv组合RSA加密
    dio.options.headers["AES_KEY_AND_IV"] = await _testRSA('${aesKey}$ivKey');

    ///发起请求,body数据转json,然后AES加密(测试数据key,iv写死)
    Response response = await dio.post(url,
        data: _aesEncrypted(aesKey, ivKey, jsonString));
    print(response.data);
    ///返回数据response.data["data"],通过AES解密
    String results = _aesDecrypted(aesKey, ivKey, response.data["data"]);
    print(results);
  }

以上就是在Flutter的网络请求中使用AES加密解密的全过程,希望能帮到同学们。

 

  • 10
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要实现异步请求网络数据并显示加载demo,我们可以使用Flutter框架的http插件和状态管理来完成。 首先,我们需要在pubspec.yaml文件添加http插件的依赖。 ``` dependencies: flutter: sdk: flutter http: ^0.13.0 ``` 然后,在需要显示加载的页面,创建一个有状态的组件。在该组件的状态定义一个布尔值isLoading来表示数据是否正在加载。 ```dart import 'package:flutter/material.dart'; import 'package:http/http.dart' as http; import 'dart:convert'; class LoadingDemo extends StatefulWidget { @override _LoadingDemoState createState() => _LoadingDemoState(); } class _LoadingDemoState extends State<LoadingDemo> { bool isLoading = false; @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: Text('Loading Demo'), ), body: Center( child: isLoading ? CircularProgressIndicator() : RaisedButton( child: Text('加载数据'), onPressed: () { fetchData(); }, ), ), ); } void fetchData() async { setState(() { isLoading = true; }); var response = await http.get('https://api.example.com/data'); if (response.statusCode == 200) { // 请求成功 var data = json.decode(response.body); // 处理数据 } else { // 请求失败 } setState(() { isLoading = false; }); } } ``` 在上述代码,isLoading初始值为false,当点击加载数据按钮时,调用fetchData函数来请求数据。在请求数据时,将isLoading设置为true来显示加载动画,请求完成后再将其设置为false。 为了能够在Flutter显示加载动画,我们使用了CircularProgressIndicator小部件,它会在屏幕间显示一个圆形的进度指示器。 通过上述代码,我们可以实现一个简单的加载demo,用于异步请求网络数据并显示加载状态。当点击加载数据按钮时,会显示加载动画,请求完成后隐藏加载动画。只需简单几步即可实现这样的功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值