Python 3 Fernet 以不同的方式加密相同的消息

我目前正在学习python并且正在尝试制作一个加密程序,每次加密相同的消息,我用Fernet实现了加密过程。


import base64

import os

from cryptography.hazmat.backends import default_backend

from cryptography.hazmat.primitives import hashes

from cryptography.hazmat.primitives.kdf.pbkdf2 import PBKDF2HMAC


password_provided = 'examplepassword'

kpassword = password_provided.encode()


salt = b'H&\xb6\n\xe6@\xdf\x13\x88\x98 Z\xf0\xea,\xca\x05\xd7\x99\x105\xa8\xa2{\xa9F\xe0\x91\x89c)\xf8%@]"u<\xe03|\xe2\re]\'\xb7\x89O2\xf9\x0bY\xf5\xb6<\x80z\\bM\x8dDx'

kdf = PBKDF2HMAC(

    algorithm = hashes.SHA256,

    length = 32,

    salt = salt,

    iterations = 100000,

    backend = default_backend()

)

key = base64.urlsafe_b64encode(kdf.derive(kpassword))



k = Fernet(key)

example = k.encrypt(b'ABC')

print(example)

这段代码按我的预期工作并加密一次,但 Fernet 每次都以不同的方式对其进行加密,我不知道为什么。如果有任何方法可以使当前程序每次都以相同的方式加密消息,请提供帮助,或者是否有另一种方法来完成我正在尝试做的事情。


以防万一你建议,不,我 90% 确定盐不是问题,因为我尝试过使用更长和更短的盐os.urandom(),我也尝试过更改密码。


编辑:我试图加密一个人提供的输入,然后其他人提供相同的输入,我想比较加密的


万千封印
浏览 357回答 2
2回答

拉风的咖菲猫

Fernet 将消息生成的时间编码为元信息,以及概率种子初始化向量 (IV)。因此,单独的调用将产生不同的代码:fernet 令牌是以下字段串联的 base64url 编码:Version ‖ Timestamp ‖ IV ‖ Ciphertext ‖ HMAC...生成新的 fernet 令牌时,必须为每个令牌唯一选择 IV。有了高质量的熵源,随机选择将很有可能做到这一点。https://cryptography.io/en/latest/fernet/https://github.com/fernet/spec/blob/master/Spec.md

慕丝7291255

这里没有错。Fernet加密使用带有 PKCS7 填充的CBC操作模式的AES-128&nbsp;。CBC 模式需要一个 IV,而这个 IV 是由 os.urandom() 生成的。因此,每次运行您将拥有不同的 IV,这将更改加密,请参阅probabilistic encryption。注意:你使用的salt是用于Key生成(PBKDF2HMAC),不是CBC模式的IV。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python