修复解密Fernet令牌时的无效签名

时间:2019-04-27 14:13:34

标签: python cryptography

我对pyhton和密码模块相对较新,因此我正在尝试学习加密和解密的基础知识。 当我加密文件并在同一程序上对其解密时,一切都很好,但是如果我尝试对预加密的文件运行解密代码(当然,我使用相同的密钥),则会收到InvalidSignature错误,随后通过InvalidToken。

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

library(purrr)

# This is how I imported your example JSON
result <- fromJSON("~/Desktop/test.JSON", simplifyVector = F)

# Note that I set simplifyVector = F so that a list is returned

result2 <- result %>%
  map(purrr::flatten) %>% 
  map(purrr::flatten) %>% 
  map_dfr(purrr::flatten)

print(result2)
# A tibble: 2 x 5
       dateTime eventName   distance  fuel vehicleType
          <dbl> <chr>          <int> <int> <chr>      
1 1556368322971 sampleEvent      350   300 NA         
2 1556368322971 sampleEvent      360   290 bus 

现在,它工作得很好,我得到了包含加密和解密消息的两个文件。 如果我删除了:

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

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

我显然缺少了一些琐碎的东西,因为它同时引发了无效签名和无效令牌。 谢谢您的帮助

1 个答案:

答案 0 :(得分:0)

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

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

相关问题