解密fernet令牌时修复无效签名

问题描述 投票:1回答:1

我对pyhton和加密模块比较新,所以我正在尝试学习加密和解密的基础知识。当我加密文件并在同一程序上解密时,一切正常,但如果我尝试在预加密文件上运行解密代码(我当然使用相同的密钥),我得到一个InvalidSignature错误,紧随其后通过InvalidToken。

现在,我认为由于某种原因钥匙不匹配,但它们确实是相同的。然后我认为由于某种原因我将字符串而不是字节传递给函数,或者存在某种可能改变加密消息的转换错误。但加密解密代码有效,所以我无法弄清楚为什么解密只会面临错误。最后,我看了解解密函数的源代码,并试图弄清楚时间戳是否与我得到的错误有关,但由于我不太经验,我无法得到任何相关信息。 。这是加密 - 解密代码:由用户给出密码,它加密并打印一个可以立即解密的文件。

import base64
import os
from cryptography.fernet import Fernet
from cryptography.hazmat.backends import default_backend
from cryptography.hazmat.primitives import hashes
from cryptography.hazmat.primitives.kdf.pbkdf2 import PBKDF2HMAC

print("Insert password: ")
password_str = input()
password = password_str.encode()
salt = os.urandom(16)

kdf = PBKDF2HMAC(algorithm=hashes.SHA256(), length=32, salt=salt, 
iterations=100000, backend=default_backend())

key = base64.urlsafe_b64encode(kdf.derive(password))
f = Fernet(key)

message = "A really secret message. Not for prying eyes.".encode()
token = f.encrypt(message)

file = open("text_encrypted.txt", "wb")
file.write(token)
file.close()

file = open("text_encrypted.txt", "rb")
data = file.read()
file.close()

token = f.decrypt(data)

file = open("text_decrypted.txt", "wb")
file.write(token)
file.close()

现在,这工作正常,我得到包含加密和解密消息的两个文件。如果我删除:

message = "A really secret message. Not for prying eyes.".encode()
token = f.encrypt(message)

file = open("text_encrypted.txt", "wb")
file.write(token)
file.close()

部分,我应该只留下一个解密代码,它应该在以前生成的加密文件上工作,应该用相同的密码解密。

我显然遗漏了一些可能微不足道的东西,因为它会引发无效签名和无效令牌。谢谢你的帮助

python cryptography
1个回答
0
投票

您正在使用的加密密钥是PBKDF2的结果。为了使PBKDF2返回相同的加密密钥,它必须获得完全相同的参数。这包括salt,在您的示例中每次都会随机生成salt。

您需要将生成的salt与加密文件一起存储,以便以后能够解密。

© www.soinside.com 2019 - 2024. All rights reserved.