Flutter RSA加密解密的示例代碼
數(shù)據(jù)加密有對(duì)稱加密(對(duì)稱密鑰方案) 和非對(duì)稱加密(公鑰加密) 兩種加密方式。
對(duì)稱加密
在對(duì)稱加密算法中,加密和解密密鑰是相同的。通信雙方必須具有相同的密鑰才能實(shí)現(xiàn)加密解密的全過(guò)程。主要目的為了防止數(shù)據(jù)存儲(chǔ)的管理方直接獲取敏感信息,是數(shù)據(jù)存儲(chǔ)安全當(dāng)中重要的一環(huán)。
對(duì)稱加密算法主要有兩種形式:分組加密和序列加密。
非對(duì)稱加密
在非對(duì)稱加密算法中,需要兩個(gè)密鑰來(lái)進(jìn)行加密和解密,且加密和解密密鑰是不同的,分別是公開(kāi)密鑰(public key,簡(jiǎn)稱公鑰)和私有密鑰(private key,簡(jiǎn)稱私鑰)。
公開(kāi)密鑰與私有密鑰是成對(duì)的,如果用公開(kāi)密鑰對(duì)數(shù)據(jù)進(jìn)行加密,只有用對(duì)應(yīng)的私有密鑰才能解密;如果用私有密鑰對(duì)數(shù)據(jù)進(jìn)行加密,那么只有用對(duì)應(yīng)的公開(kāi)密鑰才能解密。因?yàn)榧用芎徒饷苁褂玫氖莾蓚€(gè)不同的密鑰,所以這種算法叫作非對(duì)稱加密算法。
非對(duì)稱加密主要是保證數(shù)據(jù)傳輸過(guò)程中的數(shù)據(jù)安全。例如:我們的登錄操作過(guò)程中的密碼傳輸,銀行賬戶信息傳輸……。
在Flutter中加密的庫(kù)非常多,通過(guò)這篇博文介紹一下使用頻率比較高的encrypt庫(kù),主流的加密方式也都支持。
先看一下常規(guī)用法:
第一步、首先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
# 全局狀態(tài)管理
provider: ^6.0.2
# 數(shù)據(jù)請(qǐng)求
dio: ^4.0.4
# 本地?cái)?shù)據(jù)持久化
shared_preferences: ^2.0.13
# 前端加密
encrypt: ^5.0.1
第二步、獲取公鑰私鑰文件
在assets 目錄下新建rsa_key文件夾,用來(lái)存儲(chǔ)我們的公鑰私鑰文件。

第三步、在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
第四步、實(shí)現(xiàn)Encrypt加密解密工具類
在lib/utils目錄下新建rsa_encrypt.dart文件,用來(lái)開(kāi)發(fā)我們的加密解密工具類。
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');輸出的內(nèi)容如下所示:

至此我們就已經(jīng)實(shí)現(xiàn)了對(duì)加密解密工具類的封裝。
第五步、使用Encrypt工具類實(shí)現(xiàn)加密
void _userLogin() async {
/// 數(shù)據(jù)加密
var password = await Encrypt.encryption(_formData["password"]);
print('_formData=$password');
}
到這里這篇博客所介紹的內(nèi)容網(wǎng)上基本一搜一大把,希望大家能繼續(xù)接著往下看。
第六步、項(xiàng)目實(shí)際需求,
為了數(shù)據(jù)安全起見(jiàn),我們所采用的的加密方案是一密一用,也就是說(shuō),生成的私鑰公鑰我們只進(jìn)行一次加密解密操作之后就回廢棄,下次使用會(huì)重新生成新的公鑰和私鑰。這樣的話前端生成公鑰私鑰肯定是不行的,所以公鑰私鑰都是在后端生成,每次進(jìn)行加密之前先向后端發(fā)起數(shù)據(jù)請(qǐng)求,拿到公鑰之后再進(jìn)行加密。因此,我們的工具類我們就可以調(diào)整為如下所示:
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 是我自己封裝的數(shù)據(jù)請(qǐng)求的工具類,如果想學(xué)習(xí)看下面的連接。
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
/// 這個(gè)格式千萬(wàn)別動(dòng),相信我
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網(wǎng)絡(luò)請(qǐng)求Dio庫(kù)的使用及封裝
還記得前面print('publicKeyString=$publicKeyString'); 輸出的內(nèi)容吧。
publicKeyString=-----BEGIN PUBLIC KEY----- MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDb6bKQPmUBcifd5L8hxzbluv50 26g5Jj5l1nYoq8mpxze6+iyIdJTUYbMVOGF4SEwSYL+0f0na4gC8m68n4eSnNUTB ynG9BG8RfLKVPow3nH+0ND7WgE2iek0Z1ECqcDkim8sM3FDmVJLsSuCTlZOiorOx bxI41zKKhL9AoO6sBQIDAQAB -----END PUBLIC KEY-----
第七步、關(guān)于秘鑰的格式(非常重要)
現(xiàn)在我們說(shuō)說(shuō)這個(gè)publicKeyString的格式吧。
第一、中間的秘鑰部分可以不換行,且前后可以有多個(gè)換行,但是不能有空格;
第二、開(kāi)始和結(jié)束的-----BEGIN PUBLIC KEY----- 、 -----END PUBLIC KEY-----必須要有;
第三、-----BEGIN PUBLIC KEY-----前面不允許有空格,最多只能有一個(gè)換行;
第四、-----END PUBLIC KEY-----前面可以有多個(gè)換行但是堅(jiān)決不能有任何空格。
第八步、使用Encrypt具類實(shí)現(xiàn)加密
void _userLogin() async {
/// 獲取公鑰
await Encrypt.getKey();
/// 數(shù)據(jù)加密
var password = await Encrypt.encryption(_formData["password"]);
print('_formData=$password');
}
到此這篇關(guān)于Flutter RSA加密解密的示例代碼的文章就介紹到這了,更多相關(guān)Flutter RSA加密解密內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- flutter Container容器實(shí)現(xiàn)圓角邊框
- Flutter實(shí)現(xiàn)頁(yè)面切換后保持原頁(yè)面狀態(tài)的3種方法
- flutter InkWell實(shí)現(xiàn)水波紋點(diǎn)擊效果
- Flutter Android端啟動(dòng)白屏問(wèn)題的解決
- Flutter 透明狀態(tài)欄及字體顏色的設(shè)置方法
- Flutter持久化存儲(chǔ)之?dāng)?shù)據(jù)庫(kù)存儲(chǔ)(sqflite)詳解
- flutter日期選擇器 flutter時(shí)間選擇器
- 詳解flutter之網(wǎng)絡(luò)請(qǐng)求dio,請(qǐng)求,攔截器簡(jiǎn)單示例
- Flutter啟動(dòng)頁(yè)(閃屏頁(yè))的具體實(shí)現(xiàn)及原理詳析
相關(guān)文章
Android仿支付寶笑臉?biāo)⑿录虞d動(dòng)畫的實(shí)現(xiàn)代碼
這篇文章主要介紹了Android仿支付寶笑臉?biāo)⑿录虞d動(dòng)畫的實(shí)現(xiàn)代碼的相關(guān)資料,需要的朋友可以參考下2016-11-11
Android自定義View實(shí)現(xiàn)游戲搖桿鍵盤的方法示例
Android進(jìn)階過(guò)程中有一個(gè)繞不開(kāi)的話題——自定義View。最近在做項(xiàng)目中又遇到了,所以下面這篇文章主要給大家介紹了利用Android自定義View實(shí)現(xiàn)游戲搖桿鍵盤的相關(guān)資料,操作方式類似王者榮耀的搖桿操作,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友們下面來(lái)一起看看吧。2017-07-07
Android基準(zhǔn)配置文件Baseline?Profile方案提升啟動(dòng)速度
這篇文章主要為大家介紹了Android基準(zhǔn)配置文件Baseline?Profile方案提升啟動(dòng)速度示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-02-02
實(shí)例分析Android中HandlerThread線程用法
本篇文章主要給大家介紹了Android HandlerThread使用介紹以及源碼解析,有需要的朋友參考學(xué)習(xí)下吧。2017-12-12
Android開(kāi)發(fā)之圖形圖像與動(dòng)畫(二)Animation實(shí)現(xiàn)圖像的漸變/縮放/位移/旋轉(zhuǎn)
Android 平臺(tái)提供了兩類動(dòng)畫,一類是Tween動(dòng)畫,就是對(duì)場(chǎng)景里的對(duì)象不斷的進(jìn)行圖像變化來(lái)產(chǎn)生動(dòng)畫效果;旋轉(zhuǎn)、平移、放縮和漸變等等,感興趣的朋友可以了解下啊,希望本文對(duì)你有所幫助2013-01-01
Flutter 實(shí)現(xiàn)下拉刷新上拉加載的示例代碼
這篇文章主要介紹了Flutter 實(shí)現(xiàn)下拉刷新上拉加載的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-12-12
淺析Android手機(jī)衛(wèi)士關(guān)閉自動(dòng)更新
保存數(shù)據(jù)的四種方式,網(wǎng)絡(luò),廣播提供者,SharedPreferences,數(shù)據(jù)庫(kù)。接下來(lái)通過(guò)本文給大家介紹android手機(jī)衛(wèi)士關(guān)閉自動(dòng)更新的相關(guān)知識(shí),感興趣的朋友一起學(xué)習(xí)吧2016-04-04

