当前位置: 首页 > news >正文

【Flutter】数据库实体类构造函数加密注意事项

源代码:

AccountEntity(
{required String account,
required String password,})
: account = encrypter.encrypt(account,iv: iv).base64,
password = encrypter.encrypt(password,iv: iv).base64,;

解密代码:

static final encrypter = Encrypter(AES(key));
encrypter.decrypt(Encrypted.fromBase64(src),iv: iv);

 假设:account = a; password=b; a加密后n0yvxAHkx5kZH3yB9brlsQ==

结果:

加密成功,数据库里存储的时间确实是加密后的数据n0yvxAHkx5kZH3yB9brlsQ==,但是解密就出问题了,解密的结果是数据库里存储的加密后的值n0yvxAHkx5kZH3yB9brlsQ==,跟没解密一样。

原因分析:

在数据库查找到数据之后也会创建AccountEntity实体类,这时候传入的是加密后的数据n0yvxAHkx5kZH3yB9brlsQ==,然后创建实体类就会再次调用encrypter.encrypt(account,iv: iv).base64,对数据进行了二次加密,所以解密是对n0yvxAHkx5kZH3yB9brlsQ==的密文进行了解密,得出了n0yvxAHkx5kZH3yB9brlsQ==。

解决方法:

不要在构造函数里加密

class AccountEntity {  
  String account;
  String password;

  AccountEntity(
      {required this.account,
      required this.password});

  static AccountEntity createAccount({
    required String account,
    required String password,
}) {
    return AccountEntity(
      : account = encrypter.encrypt(account,iv: iv).base64,
        password = encrypter.encrypt(password,iv: iv).base64);
    }
}

相关文章:

  • 深度学习有哪些算法?
  • 30、map 和 unordered_map的区别和实现机制【高频】
  • FreeRTOS之信号量
  • 【后端】【django】Django DRF `@action` 详解:自定义 ViewSet 方法
  • 微信小程序实现根据不同的用户角色显示不同的tabbar并且可以完整的切换tabbar
  • 母婴商城系统Springboot设计与实现
  • 冠珠瓷砖×郭培“惟质致美”品质主题片上映,讲述高定艺术背后的致美品质故事
  • SSM基础专项复习5——Maven私服搭建(2)
  • 1.2、Java中的私有方法
  • 前端笔试高频算法题及JavaScript实现
  • 安科瑞EMS3.0开启企业微电网能源管理新篇章
  • 了解printf函数
  • (包清楚解疑)ES6中__dirname和__filename不见了吗?,到底怎么用
  • 从零到精通文本指令:打造个人AI助理的完整指令库(Prompt 指令实操)
  • IIC协议-HAL库
  • 在微信小程序或前端开发中,picker 和 select 都是用户交互中用于选择的组件,但它们在功能、设计和使用场景上有一定的区别
  • StarRocks + Paimon 在阿里集团 Lakehouse 的探索与实践
  • go回调函数的使用
  • 分而治之:用于 RGB-T 显著目标检测的 Confluent Triple-Flow 网络(问题)
  • 基于Babylon.js的Shader入门三(让Shader中的纹理动起来)
  • 李在明遭遇暗杀威胁,韩国警方锁定两名嫌疑人
  • 澎湃读报丨多家央媒刊文关注拧紧纪律的螺丝:强化监督推动过紧日子要求落到实处
  • 习近平在河南洛阳市考察调研
  • 莱布雷希特专栏:古典乐坛边缘人
  • 杨国荣︱以经验说事:思想史研究中一种需要反思的现象
  • 被央视曝光“废旧厂区沦为垃圾山”,江西萍乡成立调查组查处