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

相同密钥下Fernet加密令牌为何变化?如何生成固定令牌?

Fernet令牌重复加密同一内容却不同的原因及解决方法

为什么密钥不变,令牌却每次不同?

Fernet的加密设计天生包含两个会动态变化的元素:

  • 随机初始化向量(IV):对称加密中,IV的作用是避免相同明文+相同密钥生成完全一致的密文,防止攻击者通过密文重复推断明文信息。Fernet每次加密都会自动生成一个全新的128位随机IV,这是令牌变化的核心原因。
  • 时间戳:Fernet令牌里嵌入了加密时的时间戳,用于后续验证令牌的有效期。每次加密的时间不同,时间戳也会跟着变,进一步导致最终令牌不一样。

如何让生成的令牌保持一致?

要实现固定令牌,必须绕过Fernet内置的随机IV和时间戳机制,但强烈不建议在生产环境这么做——这会彻底破坏Fernet的安全防护能力,仅适合测试或特定非安全场景。

可以手动固定IV和时间戳,直接调用Fernet底层逻辑来构建令牌,示例代码如下:

from cryptography.fernet import Fernet
import base64

# 使用原示例的固定密钥
key = b'vIkpEFEgCEOSQDfr9cTgDJnOFp9b2Wb7MLv55BhFYYY='
fernet = Fernet(key)

# 固定IV(必须是16字节,符合AES加密要求)
fixed_iv = b'0123456789abcdef'
# 固定时间戳(这里用全0代表时间戳为0)
fixed_timestamp = b'\x00\x00\x00\x00\x00\x00\x00\x00'

# 手动执行加密流程
encryptor = fernet._cipher.encryptor_with_fixed_iv(fixed_iv)
ciphertext = encryptor.update(b'my_dark_secret') + encryptor.finalize()

# 组装Fernet令牌的核心部分:版本标识 + 时间戳 + IV + 密文
token_core = b"\x80" + fixed_timestamp + fixed_iv + ciphertext
# 添加HMAC签名(Fernet令牌必须带签名才能被验证)
hmac_signature = fernet._signing_key.sign(token_core)
full_token = token_core + hmac_signature

# 编码为Fernet标准的URL安全Base64格式
final_token = base64.urlsafe_b64encode(full_token)
print(final_token)

注意事项

  • 这种操作会让相同明文生成完全相同的密文令牌,极易被攻击者通过彩虹表、统计分析等方式破解,绝对不能用于生产环境的敏感数据加密。
  • 仅适合测试场景,比如需要验证加密逻辑是否正确、生成固定测试用令牌等。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 10:27:24