<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
資料加密有對稱加密(對稱金鑰方案) 和非對稱加密(公鑰加密) 兩種加密方式。
在對稱加密演演算法中,加密和解密金鑰是相同的。通訊雙方必須具有相同的金鑰才能實現加密解密的全過程。主要目的為了防止資料儲存的管理方直接獲取敏感資訊,是資料儲存安全當中重要的一環。
對稱加密演演算法主要有兩種形式:分組加密和序列加密。
在非對稱加密演演算法中,需要兩個金鑰來進行加密和解密,且加密和解密金鑰是不同的,分別是公開金鑰(public key,簡稱公鑰)和私有金鑰(private key,簡稱私鑰)。
公開金鑰與私有金鑰是成對的,如果用公開金鑰對資料進行加密,只有用對應的私有金鑰才能解密;如果用私有金鑰對資料進行加密,那麼只有用對應的公開金鑰才能解密。因為加密和解密使用的是兩個不同的金鑰,所以這種演演算法叫作非對稱加密演演算法。
非對稱加密主要是保證資料傳輸過程中的資料安全。例如:我們的登入操作過程中的密碼傳輸,銀行賬戶資訊傳輸……。
在Flutter中加密的庫非常多,通過這篇博文介紹一下使用頻率比較高的encrypt
庫,主流的加密方式也都支援。
先看一下常規用法:
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
資料夾,用來儲存我們的公鑰私鑰檔案。
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
在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');
輸出的內容如下所示:
至此我們就已經實現了對加密解密工具類的封裝。
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; } }
還記得前面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-----
前面可以有多個換行但是堅決不能有任何空格。
void _userLogin() async { /// 獲取公鑰 await Encrypt.getKey(); /// 資料加密 var password = await Encrypt.encryption(_formData["password"]); print('_formData=$password'); }
到此這篇關於Flutter RSA加密解密的範例程式碼的文章就介紹到這了,更多相關Flutter RSA加密解密內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45