You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter登录项目中解密字符串与输入值相等却判定不等问题

Flutter登录密码验证异常问题分析

我正在开发一个Flutter登录项目,加密解密流程看似正常,但验证用户输入密码时出现异常。执行代码后输出mypass mypass Failed,预期应该是mypass mypass Passed。

加密密码代码

final _getKey = encrypter.Key.fromUtf8(key);
final encryptServ = encrypter.Encrypter(encrypter.AES(_getKey, mode: encrypter.AESMode.cbc));
final InitVect = encrypter.IV.fromUtf8(key.substring(0,16));

encrypter.Encrypted _encryptDat = encryptServ.encrypt(Value,iv: InitVect);
return _encryptDat;

解密密码代码

final key = encrypterQERT.Key.fromUtf8('key');
final iv = encrypterQERT.IV.fromUtf8('key');

final encrypter = encrypterQERT.Encrypter(encrypterQERT.AES(key, mode: encrypterQERT.AESMode.cbc, padding: null));
final decrypted = encrypter.decrypt64(_passValues.elementAt(0), iv: iv);

密码验证代码

List<dynamic> _passValues = <dynamic>[];
for(final _userPass in _getPass.rows) {
  dynamic _getFirst = _userPass.assoc().values.elementAt(0);
  print(_getFirst);
  _passValues.add(_getFirst);
}

final key = encrypterQERT.Key.fromUtf8('key');
final iv = encrypterQERT.IV.fromUtf8('key');

final encrypter = encrypterQERT.Encrypter(encrypterQERT.AES(key, mode: encrypterQERT.AESMode.cbc, padding: null));
final decrypted = encrypter.decrypt64(_passValues.elementAt(0), iv: iv);
print(_userPasswordInput);
print(decrypted);

if(decrypted == _userPasswordinput) {
  print("Passed");
} else {
  print("Failed");
}

问题原因

  1. 变量名大小写错误:验证逻辑里的判断条件使用的是_userPasswordinput,但前面打印的变量是_userPasswordInput(最后一个字母I的大小写不一致),变量名不匹配直接导致比较结果为false。
  2. 加密解密参数不匹配:
    • IV取值逻辑不一致:加密时IV是key.substring(0,16),解密时直接用'key'作为IV,两者取值规则不同,会引发解密结果异常。
    • Padding设置不一致:加密时AES使用默认的PKCS7填充,解密时明确设置padding: null,填充方式不匹配会让解密后的字符串可能包含隐藏的多余填充字节,即使打印显示内容相同,实际底层字节存在差异,导致字符串比较失败。

内容的提问来源于stack exchange,提问作者HenryCollin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 12:21:03