我目前正在学习python并且正在尝试制作一个加密程序,每次加密相同的消息,我用Fernet实现了加密过程。import base64import osfrom cryptography.hazmat.backends import default_backendfrom cryptography.hazmat.primitives import hashesfrom cryptography.hazmat.primitives.kdf.pbkdf2 import PBKDF2HMACpassword_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(),我也尝试过更改密码。编辑:我试图加密一个人提供的输入,然后其他人提供相同的输入,我想比较加密的
2 回答
拉风的咖菲猫
TA贡献1995条经验 获得超2个赞
Fernet 将消息生成的时间编码为元信息,以及概率种子初始化向量 (IV)。因此,单独的调用将产生不同的代码:
fernet 令牌是以下字段串联的 base64url 编码:
Version ‖ Timestamp ‖ IV ‖ Ciphertext ‖ HMAC...
生成新的 fernet 令牌时,必须为每个令牌唯一选择 IV。有了高质量的熵源,随机选择将很有可能做到这一点。
慕丝7291255
TA贡献1859条经验 获得超6个赞
这里没有错。Fernet加密使用带有 PKCS7 填充的CBC操作模式的AES-128 。
CBC 模式需要一个 IV,而这个 IV 是由 os.urandom() 生成的。因此,每次运行您将拥有不同的 IV,这将更改加密,请参阅probabilistic encryption。
注意:你使用的salt是用于Key生成(PBKDF2HMAC),不是CBC模式的IV。
添加回答
举报
0/150
提交
取消
