likes
comments
collection
share

关于Flutter 使用 encrypt: ^4.1.0 避坑

作者站长头像
站长
· 阅读数 44

开工一天,闲着也是闲着【虽然年前留着一堆bug还没有动-(手动狗头)】,于是有开始了我学习的道路。因为是在用flutter重构旧的项目,就算如此我也要将代码好的地方一比一拷贝过来;不为别的就是有点懒,但是在实现的时候关于使用AES加密的方法很多都使用了一个叫做flutter_aes_ecb_pkcs5: ^0.1.1这个插件包。但是我更倾向于如果能Dart能实现那就用Dart实现最完美不过了,于是我使用了encrypt: ^4.1.0。因为我没有用过flutter_aes_ecb_pkcs5: ^0.1.1我也不好多加评判。

关于Flutter 使用 encrypt: ^4.1.0 避坑

encrypt: ^4.1.0 的相关使用

pubspec.yaml
#AES 加解密
encrypt: ^4.1.0
然后 Pub get 

这个包对应的主页上有比较详细的介绍,当然看官方的文档一定是没有问题的。但是,我就是看官方的文档整懵逼的。来来来,不废话先上个代码开心一下: 

import 'package:encrypt/encrypt.dart';

void main() {
// 加密的内容
  final plainText = 'Lorem ipsum dolor sit amet, consectetur adipiscing elit';
// 加密的秘钥
  final key = Key.fromUtf8('my 32 length key................');
// 初始化的向量官方代码里是这么注释的{Represents an Initialization Vector}
  final iv = IV.fromLength(16);
//加密容器
  final encrypter = Encrypter(AES(key));
//加密部分
  final encrypted = encrypter.encrypt(plainText, iv: iv);
//解密部分
  final decrypted = encrypter.decrypt(encrypted, iv: iv);

  print(decrypted); // Lorem ipsum dolor sit amet, consectetur adipiscing elit
  print(encrypted.base64); // R4PxiU3h8YoIRqVowBXm36ZcCeNeZ4s1OvVBTfFlZRdmohQqOpPQqD1YecJeZMAop/hZ4OxqgC1WtwvX/hP9mw==
}

把我整懵逼的地方是,我打算将加密跟解密分成两个方法放到一个工具类里面去。加密还好直接把解密部分去掉就好了。但是解密在怎么处理?我总不能把加密的对象encrypter存起来在用吧!这样加解密有何意义。

关于Flutter 使用 encrypt: ^4.1.0 避坑

捞代码的农民

进入这个包发现encrypter这个对象我最后使用的只是它的base64,那我能不能将加密好的base64字符串转成

Uint8List

赋值给它。于是我做了一个傻逼的操作Encrypted(Uint8List.fromList)

关于Flutter 使用 encrypt: ^4.1.0 避坑

我想方法应该是没啥问题,但是参数估计有问题。直到我注意到了这个包里的这个代码:

/// Gets the Encrypted bytes as a Base64 representation.
String get base64 => convert.base64.encode(_bytes);

现在我就明白了,不直接传加密后的字符串也可以解密了。只需要在前将base64解密一下就能解决问题:

var res = convert.base64.decode(content);

到此为止。我也总算学到了点东西,反正文档找不到的,代码就能告诉你答案,尽管答案获取答案可能麻烦点,或者答案其实很白痴,但是百度都找不到的,我就当为自己记录一下吧。

后面附上全部代码:

import 'dart:convert' as convert;
import 'package:encrypt/encrypt.dart';
import 'log_utils.dart';

class AesUtils {
  /**
   * 加密
   */
  static Encrypted encryptAes(String content, String aesKey,
      {AESMode aesMode = AESMode.ecb,IV iv}) {
    final _aesKey = Key.fromUtf8(aesKey);
    final _encrypter = Encrypter(AES(_aesKey, mode: aesMode));
    final _encrypted = _encrypter.encrypt(content,iv: iv);

    LogUtil.e(_encrypted.base64);
    return _encrypted;
  }

  /**
   * 解密
   */
  static String decryptAes(String content, String aesKey,
      {AESMode aesMode = AESMode.ecb,IV iv}) {
    // AES
    var _res = convert.base64.decode(content);
    final _aesKey = Key.fromUtf8(aesKey);
    final _encrypter =
        Encrypter(AES(_aesKey, mode: AESMode.ecb));
    final _decrypted = _encrypter.decrypt(Encrypted(_res),iv: iv);
    LogUtil.e(_decrypted);

    return _decrypted;
  }
}

关于Flutter 使用 encrypt: ^4.1.0 避坑

转载自:https://juejin.cn/post/6930567799513448456
评论
请登录