我现在正在学习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()尝试了更长和更短的盐,我也尝试了更改密码。
编辑:我正在尝试加密一个人提供的输入,然后其他人提供相同的输入,我想比较加密的
发布于 2019-03-29 20:12:32
这里没有错。 Fernet 加密使用 AES-128 和带有 PKCS7 填充的 CBC操作模式。
CBC模式需要一个IV,这个IV是由os.urandom()生成的。所以,每次运行你都会有一个不同的IV,这将改变加密,参见probabilistic encryption。
注意:您使用的盐用于密钥生成(PBKDF2HMAC),而不是用于CBC模式的IV。
https://stackoverflow.com/questions/55416897
复制相似问题