/ MD5 ( Message-Digest Algorithm ) /

        MD5消息摘要算法 , 由MD4、MD3、MD2 改进而来,主要增强算法复杂度和不可逆性 , 密码散列函数 。可以生成一个128位(16个字符(BYTES))的散列值(hash value), 128位的MD5散列被表示为32位十六进制数字 , 确保信息完整一致传输 。可以被破解 , 证实MD5算法无法防止碰撞攻击,因此不适用于安全性认证,如SSL公开密钥认证或是数字签名等用途。对于高度安全性的资料 可以使用 SHA-2 算法 。

MD5在线加密 / MD5免费解密 /  MD5付费解密

/  MD5验证签名  /

密钥可以是任意字符串 , 为了增加破解难度 ,客户端和服务端协商的密钥字符串长度尽量要长 。密钥分别在客户端和服务端保存了一份 。客户端获取时间戳、签名和其他必备参数添加到Map集合中 , 然后对Map集合按Key的首字母顺序排列 , 最好遍历Map集合分别获取key和value循环拼接到赋值给一个字符串变量 。通过遍历集合拼接好的字符串末尾拼接协商的密钥 , 将这个拼接好的字符串通过Md5算法加密 。

/ 时间戳防止重复提交 /

Redis (REmote DIctionary Server)  是  key-value 存储系统,是跨平台的非关系型数据库。开源的使用 ANSI C 语言编写、遵守 BSD 协议、支持网络、可基于内存、分布式、可选持久性的键值对(Key-Value)存储数据库 。Redis 通常被称为数据结构服务器,因为值(value)可以是字符串(String)、哈希(Hash)、列表(list)、集合(sets)和有序集合(sorted sets)等类型。

获取上次存储到redius的时间戳和客户端发起请求到时间戳进行对比 , 以此来校验时间戳是否重复 、session是否超时 。

/ Map集合按Key的首字母排序 /

DartPad

排序算法

排序后

/ MD5加密 /

获取 Android 平台密钥签名

打开 Flutter工程 下Android文件 配置密钥 到 gradle.properties (Project Properties)

build.gradle 下配置 flutterMd5Key (对应的别名 : FLUTTER_MD5_KEY)

Android Studio 菜单栏通过 build -> make project  编译项目后在BuildConfig文件下生成 静态的不可变的密钥 FLUTTER_MD5_KEY 。

Flutter 与 Android原生建立通信 ,获取密钥 (FLUTTER_MD5_KEY)

在main函数调用里面需要调用 函数 ensuerInitialized (WidgetFlutterBinding用于与 Flutter 引擎进行交互 )  , Flutter获取Android原生交换返回的密钥 FLUTTER_MD5_KEY 添加到 参与签名的Map集合中 , 最后遍历集合拼接签名参数进行Md5加密 。

WidgetsFlutterBinding.ensureInitialized();

pubspec.yaml 文件下配置 common_utils 依赖库 (包含了md5加密的工具类)

import 'package:common_utils/common_utils.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/services.dart';void main() async {///时间戳var _milSec = (DateTime.now().millisecondsSinceEpoch / 100).toStringAsFixed(0);/// Map 集合Map<String, dynamic> encryMap = {'g_key': 'g_value','b_key': 'b_value','e_key': 'e_value','a_key': 'a_value','mil_sec':'$_milSec'};/// Map 集合的键存储到 List 集合List<String> keys = encryMap.keys.toList();/// Map 集合按照 key 排序keys.sort((a, b) {List<int> al = a.codeUnits;List<int> bl = b.codeUnits;for (int i = 0; i < al.length; i++) {if (bl.length <= i) return 1;if (al[i] > bl[i]) {return 1;} else if (al[i] < bl[i]) return -1;}return 0;});print('排序后的key $keys \n');var _signStr = '';keys.asMap().forEach((k, v) {encryMap.forEach((pk, pv) {if (v == pk) {print('键集合keys索引$k   集合encryMap键$pk  集合encryMap值$pv');_signStr += pk + "=" + '${pv ?? ''}' + "&";}});});WidgetsFlutterBinding.ensureInitialized();var _flutterNativeKeyValue = await FlutterPlugins.senData('flutterSendNavData');_signStr = _signStr.substring(0, _signStr.length - 1) + _flutterNativeKeyValue;///拼接好的签名参数print('拼接好的签名参数 $_signStr');var _encMdeSignStr=EncryptUtil.encodeMd5(_signStr);print('Md5签名:$_encMdeSignStr');
}class FlutterPlugins {static const MethodChannel channel =const MethodChannel("com.flutter.native.key");static Future<String> senData(String result) async {return await channel.invokeMethod("flutterNativeKey", result);}
}

MD5在线加密 对依赖库的签名算法进行验证

获取 IOS 平台密钥签名

使用Xcode工具打开Flutter工程里面的IOS文件夹 , 找到 AppDelegate.swift 文件打开 , 配置密钥完成Flutter从IOS获取密钥的过程

import UIKit
import Flutter@UIApplicationMain
@objc class AppDelegate: FlutterAppDelegate {var methodChannel:FlutterMethodChannel?override func application(_ application: UIApplication,didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {GeneratedPluginRegistrant.register(with: self)///Flutter和IOS通信的唯一标识符 com.flutter.native.keylet vc = self.window.rootViewController as! FlutterViewControllerself.methodChannel = FlutterMethodChannel.init(name: "com.flutter.native.key", binaryMessenger: vc.binaryMessenger)self.methodChannel!.setMethodCallHandler { (call , result) in///Flutter调用的函数if(call.method == "flutterNativeKey"){///密钥result("qazwsxedcrfvtgbyhnujmikolp0987654321");}}return super.application(application, didFinishLaunchingWithOptions: launchOptions)}
}

xcode控制台输出的加密参数 

/ 调用so文件 /

在当前工程目录下 用这个命令创建flutter工程 native_add

flutter create --platforms=android,ios --template=plugin native_add

在创建的natvie_add工程里面的 ios 文件夹下 Classes 文件夹里面创建 native_add.cpp 文件

native_add.cpp文件里面配置密钥

#include <stdint.h>
#include <string.h>#define DART_API extern "C" __attribute__((visibility("default"))) __attribute__((used))
DART_API const char *greetString(const char *platform) {char _platform[]="android";if(strcmp(_platform,platform)==0){return "androidqazwsxedcrfvtgbyhnujmikolp0987654321";}return  "iosdqazwsxedcrfvtgbyhnujmikolp0987654321";
}

在创建的natvie_add工程里面的 Android 文件夹下 创建 CMakeLists.txt  文件用来定义如何编译源文件 , 添加 externalNativeBuild 到 android/build.gradle

native_add 工程 pubspec.yaml 文件下配置ffi依赖库 并完成依赖加载

native_add.dart 文件里面 导入ffi 依赖 , Android平台加载libnative_add.so库 ,工程编译后会生成.so库文件 (build/native_add/intermediates/cmake/debug/obj路径下)

运行工程查看从 native_add.cpp 获取到的密钥

下载案例

Flutter 项目实战 网络请求MD5+时间戳+验证签名 十一相关推荐

  1. flutter 项目实战二 网络请求

    本项目借用 逛丢 网站的部分数据,仅作为 flutter 开发学习之用. 逛丢官方网址:https://guangdiu.com/ flutter windows开发环境设置 flutter 项目实战 ...

  2. Flutter 项目实战(Dio+MVP+FutureBuilder )五

    / 没有感情万千 .只有默默无闻 / 2022年跨年了,又涨了一岁.随着时光的流逝,工作多年的我还是在坚持些代码.互联网都有所谓的大龄危机,我对此毫无畏惧.不要因为社会存在一些大龄危机的恐慌,产生了很 ...

  3. 12、Flutter - 项目实战 - 仿微信(六)聊天页面

    Flutter - 项目实战 - 仿微信(六)聊天页面 接上篇:11.Flutter - 项目实战 - 仿微信(五)通讯录 详细代码参见Demo Demo地址 -> wechat_demo 其他 ...

  4. flutter 项目实战四 列表数据展示

    本项目借用 逛丢 网站的部分数据,仅作为 flutter 开发学习之用. 逛丢官方网址:https://guangdiu.com/ flutter windows开发环境设置 flutter 项目实战 ...

  5. Flutter Dio包网络请求抓包解决方案

    在Flutter中进行网络请求时,我们可以使用的库有3个,即Http请求库.HttpClient请求库和Dio请求库(详细介绍请参考:Flutter开发之Http网络请求),使用得最多的就是Dio请求 ...

  6. iOS 项目中 网络请求Alamofire 的二次封装

    iOS 项目中 网络请求Alamofire 的二次封装 1.先创建 网络请求的工具类 NetWorkTool 继承自NSObject class NetWorkTool: NSObject {} 2. ...

  7. Flutter 项目实战 Dio网络请求 四

    /  HTTP  |   HTTPS  / HTTP是一个客户端(用户)和 服务端(网站)之间请求和应答的标准,通常使用TCP协议.客户端发起一个HTTP请求到服务器上指定端口(默认端口为80).客户 ...

  8. Flutter项目实战之女装商城------火爆专区实现、商品分类数据准备

    火爆专区实现: 继续Flutter项目的学习,在上一次https://www.cnblogs.com/webor2006/p/14410445.html咱们已经对于首页的大部分功能已经完成,但是呢,还 ...

  9. Python编程:从入门到实践+爬虫开发与项目实战+网络编程基础+项目开发实战

    给还在苦苦自学Python的小伙伴们分享一波学习教程~有了它们,至少能节省50%的时间,少走一半的弯路. 书不在多,而在于精~ <Python编程:从入门到实践>豆瓣评分9.2 本书是针对 ...

  10. Flutter开发之——网络请求-Dio

    一 概述 Dio是一个强大的Dart/Flutter http请求库 Dio支持Restful API.formData.拦截器.请求取消.Cookie管理.文件上传/下载.超时.自定义适配器等 二 ...

最新文章

  1. tar包在linux下 java安装
  2. php获取当前域名、主机、URL、端口、参数、网址、路径、代理等
  3. PL/SQL Developer 导入外部文件数据
  4. NSUserDefaults 、对象归档
  5. 计算面平均边_家装门窗订单常用的门窗尺寸测量和计算方法
  6. 我正在运行哪个版本的PostgreSQL?
  7. 图形化服务端svn(win 10)
  8. VS调试配置外网可访问
  9. java基础 -- Apache POI将PPT转换成图片
  10. 益而优有机核桃油给宝宝安全放心的油!
  11. 老男孩Day1作业(二):三级菜单
  12. linux yes 命令_如何在Linux上使用yes命令
  13. [R语言] 生成随机数
  14. Linux signal捕获
  15. 中山大学数学科学与计算机科学,中山大学数学与计算科学学院导师介绍:邹青松...
  16. TI-Nspire CX CAS图形计算器模拟器+操作指南
  17. [转]家庭上网安装与设置教程
  18. 我在网易实习的日子:爱与被爱之中成长
  19. 1.65亿融资背后,是时候把「百度」标签从林元庆身上摘下了| 人物特写
  20. wordpress优化之实现百度站内收索

热门文章

  1. 企业微信有什么用,介绍企业微信6个强大的功能
  2. AWS RDS services
  3. 图灵奖Alan Kay:突破常规思维!道翰天琼认知智能机器人平台API接口大脑为您揭秘
  4. 「日历订阅」全网首发2023年中国法定节假日
  5. 剑指 Offer(C++版本)系列:剑指 Offer 13 机器人的运动范围
  6. python文本关联分析_如何对文本内的某个词的关联词进行提取?
  7. 6寸相纸怎么排版两寸照片
  8. TOEFL wordlist 24
  9. 数据库迁移(MySQL函数转化为Oracle函数)
  10. 关于CSS小三角的实现,小三角边框的实现,IE6下CSS小三角非透明的情况