相同密钥下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
相关产品推荐
相关产品推荐

