7.4 密码 aes 后传输

7.4 密码 aes 后传输

效果

img

AES 介绍

密码需要在传输中加密,防止被网关抓包,平时你们用的 wifi 都是可以被抓包的

https://zh.wikipedia.org/wiki/高级加密标准

高级加密标准(英语:Advanced Encryption Standard,缩写:AES),又称Rijndael 加密法(荷兰语发音:ˈrɛindaːlˈrɛindaːl,音似英文的“Rhine doll”),是美国联邦政府采用的一种区块加密标准。这个标准用来替代原先的DES,已经被多方分析且广为全世界所使用。经过五年的甄选流程,高级加密标准由美国国家标准与技术研究院(NIST)于 2001 年 11 月 26 日发布于 FIPS PUB 197,并在 2002 年 5 月 26 日成为有效的标准。现在,高级加密标准已然成为对称密钥加密中最流行的算法之一。

之所以选这个加密法,是因为 wordpress rest api 中的接口,输入的 password 是一个明文,其实输入 md5 签名更好。

img

实现步骤:


第 1 步:安装插件 encrypt

1
flutter pub add encrypt

第 2 步:定义常量

lib/common/values/constants.dart

1
2
3
// AES
static const aesKey = 'aH5aH5bG0dC6aA3oN0cK4aU5jU6aK2lN';
static const aesIV = 'hK6eB4aE1aF3gH5q';

aesKey 加密 key 32 位
aesIV 加密向量 16 位
具体的请联系后端工程师,保持一致可调通

第 3 步:创建加密类 encrypt

lib/common/utils/encrypt.dart

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
import 'package:encrypt/encrypt.dart';
import 'package:flutter_woo_commerce_getx_learn/common/index.dart';

/// 加密类
class EncryptUtil {
static final EncryptUtil _instance = EncryptUtil._internal();
factory EncryptUtil() => _instance;
EncryptUtil._internal() {
encrypter = Encrypter(AES(
key,
mode: AESMode.cbc,
padding: 'PKCS7',
));
}

final key = Key.fromUtf8(Constants.aesKey);
final iv = IV.fromUtf8(Constants.aesIV);
late Encrypter encrypter;

/// aes加密
String aesEncode(String content) {
final encrypted = encrypter.encrypt(content, iv: iv);
return encrypted.base64;
}
}

第 4 步:登录加密

lib/pages/system/login/controller.dart

1
2
3
4
5
6
7
8
9
10
11
12
13
/// Sign In
Future<void> onSignIn() async {
if ((formKey.currentState as FormState).validate()) {
try {
Loading.show();

// aes 加密密码
var password = EncryptUtil().aesEncode(passwordController.text);

UserToken res = await UserApi.login(UserLoginReq(
...
password: password,
));

第 5 步:注册加密

lib/pages/system/register/controller.dart

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// 注册
void onSignUp() {
if ((formKey.currentState as FormState).validate()) {
// aes 加密密码
var password = EncryptUtil().aesEncode(passwordController.text);

//验证通过
Get.offNamed(
RouteNames.systemRegisterPin,
arguments: UserRegisterReq(
...
password: password,
),
);
}
}

提交代码到 git