数据加密有对称加密(对称密钥方案)非对称加密(公钥加密) 两种加密方式。

对称加密

在对称加密算法中,加密和解密密钥是相同的。通信双方必须具有相同的密钥才能实现加密解密的全过程。主要目的为了防止数据存储的管理方直接获取敏感信息,是数据存储安全当中重要的一环。

对称加密算法主要有两种形式:分组加密序列加密

非对称加密

在非对称加密算法中,需要两个密钥来进行加密和解密,且加密和解密密钥是不同的,分别是公开密钥(public key,简称公钥)和私有密钥(private key,简称私钥)。

公开密钥与私有密钥是成对的,如果用公开密钥对数据进行加密,只有用对应的私有密钥才能解密;如果用私有密钥对数据进行加密,那么只有用对应的公开密钥才能解密。因为加密和解密使用的是两个不同的密钥,所以这种算法叫作非对称加密算法。

非对称加密主要是保证数据传输过程中的数据安全。例如:我们的登录操作过程中的密码传输,银行账户信息传输……。

在Flutter中加密的库非常多,通过这篇博文介绍一下使用频率比较高的encrypt库,主流的加密方式也都支持。

先看一下常规用法:

第一步、首先pubspec.yaml中添加依赖

dev_dependencies:
  flutter_test:
    sdk: flutter
  # The "flutter_lints" package below contains a set of recommended lints to
  # encourage good coding practices. The lint set provided by the package is
  # activated in the `analysis_options.yaml` file located at the root of your
  # package. See that file for information about deactivating specific lint
  # rules and activating additional ones.
  flutter_lints: ^1.0.0
  # 全局状态管理
  provider: ^6.0.2
  # 数据请求
  dio: ^4.0.4
  # 本地数据持久化
  shared_preferences: ^2.0.13
  # 前端加密
  encrypt: ^5.0.1

第二步、获取公钥私钥文件

assets 目录下新建rsa_key文件夹,用来存储我们的公钥私钥文件。

在这里插入图片描述

第三步、在pubspec.yaml文件中添加公钥私钥文件。

flutter:
  # The following line ensures that the Material Icons font is
  # included with your application, so that you can use the icons in
  # the material Icons class.
  uses-material-design: true

  # To add assets to your application, add an assets section, like this:
  assets:
    - assets/fonts/iconfont.json
    - assets/rsa_key/rsa_public_key.pem
    - assets/rsa_key/rsa_private_key.pem
    #   - images/a_dot_burr.jpeg
    #   - images/a_dot_ham.jpeg
    - assets/images/home_logo.png

第四步、实现Encrypt加密解密工具类

lib/utils目录下新建rsa_encrypt.dart文件,用来开发我们的加密解密工具类。

import 'dart:convert';
import 'package:encrypt/encrypt.dart';
import 'package:flutter/services.dart';
import 'package:pointycastle/asymmetric/api.dart';
class Encrypt {
  ///  加密
  static encryption(content) async {
    final parser = RSAKeyParser();
    String publicKeyString = await rootBundle.loadString('assets/rsa_key/rsa_public_key.pem');
    print('publicKeyString=$publicKeyString'); // 注意这一行的输出
    RSAPublicKey publicKey = parser.parse(publicKeyString) as RSAPublicKey;
    final encrypter = Encrypter(RSA(publicKey: publicKey));
    return encrypter.encrypt(content).base64;
  }
  /// 解密
  static Future<String> decrypt(String decoded) async {
    final parser = RSAKeyParser();
    String privateKeyString = await rootBundle.loadString('assets/rsa_key/rsa_private_key.pem');
    final privateKey = parser.parse(privateKeyString) as RSAPrivateKey;
    final encrypter = Encrypter(RSA(privateKey: privateKey));
    return encrypter.decrypt(Encrypted.fromBase64(decoded));
  }
}

print('publicKeyString=$publicKeyString');输出的内容如下所示:

在这里插入图片描述

至此我们就已经实现了对加密解密工具类的封装。

第五步、使用Encrypt工具类实现加密

  void _userLogin() async {
    /// 数据加密
    var password = await Encrypt.encryption(_formData["password"]);
    print('_formData=$password');
  } 

到这里这篇博客所介绍的内容网上基本一搜一大把,希望大家能继续接着往下看。

第六步、项目实际需求,

为了数据安全起见,我们所采用的的加密方案是一密一用,也就是说,生成的私钥公钥我们只进行一次加密解密操作之后就回废弃,下次使用会重新生成新的公钥和私钥。这样的话前端生成公钥私钥肯定是不行的,所以公钥私钥都是在后端生成,每次进行加密之前先向后端发起数据请求,拿到公钥之后再进行加密。因此,我们的工具类我们就可以调整为如下所示:

import 'dart:convert';
import 'package:cyber_security/utils/http.dart';
import 'package:encrypt/encrypt.dart';
import 'package:flutter/services.dart';
import 'package:pointycastle/asymmetric/api.dart';
class Encrypt {
  /// 公钥
  static String pubKey = '';
  /// 可以理解为是本次使用的公钥的id
  static String key = '';
  /// 获取公钥
  static getKey() async {
    /// DioRequest 是我自己封装的数据请求的工具类,如果想学习看下面的连接。
    var response = await DioRequest.getInstance().dio.get('/getKey');
    var data = jsonDecode(response.toString());
    pubKey = data['key'];
    key = data['_key'];
  }
  ///  加密
  static encryption(content) async {
    final parser = RSAKeyParser();
    /// start
    /// 这个格式千万别动,相信我
    String publicKeyString = '''
-----BEGIN PUBLIC KEY-----
$pubKey
-----END PUBLIC KEY-----
''';
    /// end
    RSAPublicKey publicKey = parser.parse(publicKeyString) as RSAPublicKey;
    final encrypter = Encrypter(RSA(publicKey: publicKey));
    return encrypter.encrypt(content).base64;
  }
}

Flutter网络请求Dio库的使用及封装

还记得前面print('publicKeyString=$publicKeyString'); 输出的内容吧。

publicKeyString=-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDb6bKQPmUBcifd5L8hxzbluv50
26g5Jj5l1nYoq8mpxze6 iyIdJTUYbMVOGF4SEwSYL 0f0na4gC8m68n4eSnNUTB
ynG9BG8RfLKVPow3nH 0ND7WgE2iek0Z1ECqcDkim8sM3FDmVJLsSuCTlZOiorOx
bxI41zKKhL9AoO6sBQIDAQAB
-----END PUBLIC KEY-----

第七步、关于秘钥的格式(非常重要)

现在我们说说这个publicKeyString的格式吧。

第一、中间的秘钥部分可以不换行,且前后可以有多个换行,但是不能有空格;

第二、开始和结束的-----BEGIN PUBLIC KEY----------END PUBLIC KEY-----必须要有;

第三、-----BEGIN PUBLIC KEY-----前面不允许有空格,最多只能有一个换行;

第四、-----END PUBLIC KEY-----前面可以有多个换行但是坚决不能有任何空格。

第八步、使用Encrypt具类实现加密

  void _userLogin() async {
    /// 获取公钥
    await Encrypt.getKey();
    /// 数据加密
    var password = await Encrypt.encryption(_formData["password"]);
    print('_formData=$password');
  } 

到此这篇关于Flutter RSA加密解密的示例代码的文章就介绍到这了,更多相关Flutter RSA加密解密内容请搜索Devmax以前的文章或继续浏览下面的相关文章希望大家以后多多支持Devmax!

Flutter RSA加密解密的示例代码的更多相关文章

  1. swift 移动支付之【支付宝支付】详细步骤

    二.准备工作支付宝开放平台1.向支付宝签约这一步因为涉及到营业执照之类,一般有公司完成,在此不赘述了。支付宝目前只支持采用RSA加密方式做签名验证。具体到支付宝使用RSA做签名验证,就是在生产订单时,需要使用私钥生成签名值;在处理返回的支付结果时,需要使用公钥验证返回结果是否被篡改了。

  2. Flutter中文教程-Cookbook

    Flutter中文网的Cookbook中包含了在编写Flutter应用程序时常见问题及示例。设计基础使用主题共享颜色和字体样式Images显示来自网上的图片用占位符淡入图片使用缓存图Lists创建一个基本list创建一个水平list使用长列表创建不同类型子项的List创建一个gridList处理手势处理点击添加Material触摸水波效果实现滑动关闭导航导航到新页面并返回给新页面传值从新页面返回数据给上一个页面网络从网上获取数据进行认证请求使用WebSockets

  3. android-studio – 未配置Dart SDK

    Initializinggradle…

  4. 安卓 – 从一个扑动的应用程序拨打电话

    或者有更好的选择从我的应用程序拨打电话?

  5. android – 如何在Flutter中添加Webview?

    我知道可以将WebView添加为整页,但找不到任何示例代码.我假设你可以使用PageView作为它的基础,但不知道如何调用本机androidWebView并将其添加到PageView.谁能指出我正确的方向?

  6. android – 如何将消息从Flutter传递给Native?

    如果需要与特定的API/硬件组件进行交互,您如何将Flutter的信息传递回Android/Native代码?是否有任何事件频道可以通过其他方式发送信息或类似于回调?

  7. android – 如何在Flutter App中处理onPause / onResume?

    我是否过于复杂的事情?即使我的用例似乎不需要它,我仍然想知道:如何自己处理onPause/onResume事件?

  8. android – 如何使用Flutter构建Augment Reality应用程序?

    我对Android开发有一些基础知识.最近听说过Flutter并且非常有兴趣研究它.我想知道是否有可能使用颤振构建增强现实应用程序以及要实现此目的的方法?请帮忙.解决方法截至目前,颤振不支持3D.Flutter现在专注于2D,团队长期计划为颤振提供优化的3Dapi.你读了常见问题here.

  9. Flutter 网络请求框架封装详解

    这篇文章主要介绍了Flutter 网络请求框架封装详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  10. PHP rsa加密解密算法原理解析

    这篇文章主要介绍了PHP rsa加密解密算法原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

随机推荐

  1. Flutter 网络请求框架封装详解

    这篇文章主要介绍了Flutter 网络请求框架封装详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  2. Android单选按钮RadioButton的使用详解

    今天小编就为大家分享一篇关于Android单选按钮RadioButton的使用详解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧

  3. 解决android studio 打包发现generate signed apk 消失不见问题

    这篇文章主要介绍了解决android studio 打包发现generate signed apk 消失不见问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

  4. Android 实现自定义圆形listview功能的实例代码

    这篇文章主要介绍了Android 实现自定义圆形listview功能的实例代码,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  5. 详解Android studio 动态fragment的用法

    这篇文章主要介绍了Android studio 动态fragment的用法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  6. Android用RecyclerView实现图标拖拽排序以及增删管理

    这篇文章主要介绍了Android用RecyclerView实现图标拖拽排序以及增删管理的方法,帮助大家更好的理解和学习使用Android,感兴趣的朋友可以了解下

  7. Android notifyDataSetChanged() 动态更新ListView案例详解

    这篇文章主要介绍了Android notifyDataSetChanged() 动态更新ListView案例详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下

  8. Android自定义View实现弹幕效果

    这篇文章主要为大家详细介绍了Android自定义View实现弹幕效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  9. Android自定义View实现跟随手指移动

    这篇文章主要为大家详细介绍了Android自定义View实现跟随手指移动,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  10. Android实现多点触摸操作

    这篇文章主要介绍了Android实现多点触摸操作,实现图片的放大、缩小和旋转等处理,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

返回
顶部