網(wǎng)站首頁(yè) 編程語(yǔ)言 正文
數(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)行加密和解密,且加密和解密密鑰是不同的,分別是公開密鑰(public key,簡(jiǎn)稱公鑰)和私有密鑰(private key,簡(jiǎn)稱私鑰)。
公開密鑰與私有密鑰是成對(duì)的,如果用公開密鑰對(duì)數(shù)據(jù)進(jìn)行加密,只有用對(duì)應(yīng)的私有密鑰才能解密;如果用私有密鑰對(duì)數(shù)據(jù)進(jìn)行加密,那么只有用對(duì)應(yīng)的公開密鑰才能解密。因?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)開發(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ù)安全起見,我們所采用的的加密方案是一密一用
,也就是說(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è)換行,但是不能有空格;
第二、開始和結(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'); }
原文鏈接:https://blog.csdn.net/qq_16221009/article/details/124081546
相關(guān)推薦
- 2022-11-09 Apifox?Echo學(xué)習(xí)curl?httpie?命令使用詳解_相關(guān)技巧
- 2022-12-23 C++類的返回值是*this的成員函數(shù)問(wèn)題_C 語(yǔ)言
- 2022-03-29 C#算法之各位相加_C#教程
- 2022-06-18 C#如何在窗體程序中操作數(shù)據(jù)庫(kù)數(shù)據(jù)_C#教程
- 2022-09-24 C#中的引用類型以及特殊引用類型詳解_C#教程
- 2022-06-28 C#使用RestClient調(diào)用Web?API_C#教程
- 2024-03-16 nginx 報(bào) unknown directive “server“ 詭異問(wèn)題處理
- 2022-11-05 C/C++讀取大文件數(shù)據(jù)方式詳細(xì)講解_C 語(yǔ)言
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過(guò)濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡(jiǎn)單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對(duì)象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支