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

如何在Dart中实现匹配Python的Fernet加密函数并解决密钥错误

解决Dart中Fernet加密的密钥错误问题

错误原因

你遇到的StateError (Bad state: Fernet key must be 32 url-safe base64-encoded bytes.)错误,核心是Dart的encrypt包和Python的Fernet库对密钥的处理逻辑不同:

  • Python的Fernet类会自动将传入的base64编码字节串解码为原始的32字节密钥;
  • 而Dart的encrypt包要求Key对象必须是原始的32字节二进制数据,你当前用Key.fromUtf8直接传入base64字符串,相当于把base64字符串的字符编码当作密钥,这显然不符合要求。

修正后的Dart代码

将base64编码的密钥解码为字节数组,再用Key.fromBytes创建密钥对象,代码如下:

import 'package:encrypt/encrypt.dart' as encrypt_package;
import 'dart:convert'; // 引入base64解码工具

String encryptFernet(String text) {
  // 先将base64密钥字符串解码为原始字节
  final List<int> keyBytes = base64Url.decode('c1563NcXz90uGYpMqpfm_k10rOLVF5Q37AY6D016n_4=');
  final encrypt_package.Key key = encrypt_package.Key.fromBytes(keyBytes);
  final encrypt_package.Fernet fernet = encrypt_package.Fernet(key);

  final encrypt_package.Encrypter encrypter = encrypt_package.Encrypter(fernet);

  final encrypt_package.Encrypted encrypted = encrypter.encrypt(text);
  return encrypted.base64;
}

匹配Python逻辑的验证

  • Python中text.encode()会将字符串转为UTF-8字节,Dart的encrypter.encrypt(text)内部默认也是使用UTF-8编码字符串,逻辑一致;
  • Python返回的加密结果是base64编码的字节串,Dart代码返回的encrypted.base64是对应的字符串,两者内容完全匹配。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 00:20:13