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

修改Fernet实现以支持AES-256加密是否可行?

你的思路有偏差,直接这么改不行!

首先得纠正你对Fernet密钥结构的一个小误解:标准Fernet的32字节(256位)密钥,前16字节是AES-128的加密密钥,后16字节是HMAC-SHA256的签名密钥——你搞反了签名和加密的部分顺序,但这不是重点,重点是直接修改密钥分割长度并不能让你实现符合预期的AES-256版Fernet,原因如下:


1. 标准Fernet是硬绑定AES-128的

Fernet的核心规范里,加密算法固定是AES-128-CBC(带PKCS7填充,IV随机生成),签名是HMAC-SHA256。你只修改密钥的分割方式,但如果不调整加密逻辑的话:

  • 如果你只是把_encryption_key改成取32字节,cryptography库会根据密钥长度自动切换到AES-256,但这时候你生成的令牌已经完全不是标准Fernet格式了——其他用标准Fernet的工具/库根本无法解密你的数据,你也无法解密标准Fernet加密的内容。

2. 你的密钥分割逻辑也有优化空间

假设你真的要做一个自定义的AES-256版“类Fernet”方案:

  • AES-256需要32字节(256位)的加密密钥,这点没错;
  • 但HMAC-SHA256的签名密钥,虽然支持任意长度,但推荐用32字节(和哈希长度一致)来避免不必要的密钥处理。所以合理的密钥结构应该是64字节(512位)的原始密钥,前32字节作为AES-256加密密钥,后32字节作为HMAC-SHA256签名密钥——而不是你代码里的前32做签名、后32做加密(当然如果只是自己内部用,顺序不影响安全性,但不符合标准Fernet的逻辑)。

3. 正确的实现方向

如果你必须满足客户的AES-256要求,有两个可行方向:

  • 自定义类Fernet实现:基于cryptography库,参照Fernet的安全流程,把加密算法换成AES-256-CBC,调整密钥结构为64字节(base64url编码后作为对外的密钥格式),同时可以修改令牌的版本号(比如从标准的0x80改成自定义值),避免和标准Fernet混淆。
  • 直接组合底层API:如果不需要严格遵循Fernet的令牌格式,也可以直接用cryptography的高层API实现“AES-256加密+HMAC签名”的组合,和Fernet的安全模型一致,但不用受Fernet规范限制。

最后说回你的代码:如果只是自己内部使用,不需要兼容标准Fernet,那么修改密钥分割为key[:32]和key[32:],同时确保加密逻辑用的是这个32字节的_encryption_key(cryptography会自动识别为AES-256),确实能实现AES-256加密,但这已经是一个自定义的加密方案,不是标准Fernet了。

内容的提问来源于stack exchange,提问作者May.D

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 07:05:06