首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Fernet.generate_key()密钥长度

Fernet.generate_key()密钥长度
EN

Stack Overflow用户
提问于 2021-02-04 01:54:16
回答 1查看 3K关注 0票数 0

我对密码学不太了解,但当我在python中使用密码库并尝试生成密钥时,密钥长度超过32。

代码语言:javascript
复制
from cryptography.fernet import Fernet
import base64

key = Fernet.generate_key()
>>>x2pXHXqCcUGjcq4HTcvdqH5xSEF_SLATO6p1Xk3tejM=

如果我使用这个密钥来解密一个消息online或外部python,它会说密钥的最大长度是32,我读到密码库使用128位密钥CBC。

我不确定这是否与填充有关,我的问题是是否可以使用这个密钥解密python外的Fernet加密消息,或者我是否可以获得原来的16个字节密钥(因为它应该使用128密钥)。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-02-04 07:50:41

Fernet.generate_key()生成并由构造函数预期的密钥实际上由两个128位密钥组成:一个用于签名,另一个用于加密,按该顺序连接。

来自源代码

代码语言:javascript
复制
    key = base64.urlsafe_b64decode(key)
    if len(key) != 32:
        raise ValueError(
            "Fernet key must be 32 url-safe base64-encoded bytes."
        )

    self._signing_key = key[:16]
    self._encryption_key = key[16:]

感谢@PaulKehrer更新

这在格式规范中有描述,引用如下:

fernet键是以下字段的base64url编码:

代码语言:javascript
复制
Signing-key ‖ Encryption-key
  • 签名-密钥,128位
  • 加密密钥,128位

使用低级库和服务来解密Fernet消息需要手动解析令牌格式

  • Fernet生产安全的base64
  • 除了数据外,令牌还包含版本、时间戳、IV和HMAC。
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66038293

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档