gpt4 book ai didi

python - 解密 fernet token 时修复无效签名

转载 作者:太空宇宙 更新时间:2023-11-04 04:13:37 28 4
gpt4 key购买 nike

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

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

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()

部分,我应该只剩下一个解密代码,它应该适用于以前生成的加密文件,应该用相同的密码解密。

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

最佳答案

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

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

关于python - 解密 fernet token 时修复无效签名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55881428/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com