1.首頁需要公鑰私鑰
生成方法百度很多;
在flutter中,密鑰文件直接存放在目錄中是無法使用File讀取到的,只能放在asset中才可以,所以需要在 pubspec.yaml
中增加相關密鑰文件纔行,例如將密鑰文件存放在與 pubspec.yaml
同級的目錄 keys
下,則需要在 pubspec.yaml
中增加如下代碼
assets:
- keys/private_key.pem
- keys/public_key.pem
2導入encrypt庫
在pubspec.yaml文件中添加
encrypt: ^3.3.1
3.創建加密輔助類EncryptHelper.dart
import 'dart:convert';
import 'package:encrypt/encrypt.dart';
import 'package:pointycastle/asymmetric/api.dart';
import 'dart:async';
import 'package:flutter/services.dart' show rootBundle;
final parser = RSAKeyParser();
abstract class EncryptHelper {
static Future<String> decode(String decoded) async {
String privateKeyString = await rootBundle.loadString('keys/private_key.pem');
final privateKey = parser.parse(privateKeyString);
final encrypter = Encrypter(RSA(privateKey: privateKey));
return encrypter.decrypt(Encrypted.fromBase64(decoded));
}
// 長參數分段加密
static Future<String> encodeLong(Map para) async{
// 設置加密對象
String publicKeyString = await rootBundle.loadString('keys/public_key.pem');
RSAPublicKey publicKey = parser.parse(publicKeyString);
final encrypter = Encrypter(RSA(publicKey: publicKey));
// map轉成json字符串
final jsonStr = jsonEncode(para);
// 原始json轉成字節數組
List<int> sourceByts = utf8.encode(jsonStr);
// 數據長度
int inputLen = sourceByts.length;
// 加密最大長度
int maxLen = 117;
// 存放加密後的字節數組
List<int> totalByts = List();
// 分段加密 步長爲117
for (var i = 0; i < inputLen; i += maxLen) {
// 還剩多少字節長度
int endLen = inputLen - i;
List<int> item;
if (endLen > maxLen) {
item = sourceByts.sublist(i, i+maxLen);
}else{
item = sourceByts.sublist(i, i+endLen);
}
// 加密後的對象轉換成字節數組再存放到容器
totalByts.addAll(encrypter.encryptBytes(item).bytes);
}
// 加密後的字節數組轉換成base64編碼並返回
String en = base64.encode(totalByts);
return en;
}
}
4.項目使用
// 參數加密
var encodePara = await EncryptHelper.encodeLong(params);