json 无法加密数据

xdnvmnnf  于 2023-04-22  发布在  其他
关注(0)|答案(1)|浏览(121)

我试图加密用户输入的信息,然后将其保存在JSON文件中的字典格式。然后,在代码的后面,我试图搜索JSON文件中的用户指定的密钥,并解密和显示值。我已经创建了2个函数来完成这一任务。
第一个:

#function to encrypt user-entered password before dumping it into a JSON file
def encryptAndDump(username, password):
    e_password = password.encode('utf-8')
    encrypted = k.encrypt(e_password)
    b64_encrypted = base64.b64encode(encrypted).decode('utf-8')
    a = {site: [username, b64_encrypted]}
    with open(dictionary, 'r') as f:
        password_dictionary = json.load(f) 
    password_dictionary = {}
    password_dictionary.update(a)
    with open(dictionary, 'w') as f:
        json.dump(password_dictionary, f)

在encryptAndDump函数中,函数外部定义的变量(“username”和“password”)是用户输入变量。
第二个:

#function to search JSON file and decrypt password information
def searchAndDecrypt():
    r_site = input("Enter the Site Name to retrieve your credentials (Password Manager is case sensitive.): ")
    with open(dictionary, 'r') as f:
        password_dictionary = json.load(f) if f.readable() else {}
    for site, user_pass in password_dictionary.items():
        if site == r_site:
            print("ACCOUNT FOUND") 
            while True:
                c_password = pwinput.pwinput("Confirm your Password Manager password to decrypt login credentials: ")
                if c_password == m_password:
                    b64_encrypted_password = user_pass[1]
                    encrypted_password = base64.b64decode(b64_encrypted_password)
                    decrypt_user_pass = k.decrypt(encrypted_password).decode('utf-8')
                    print(decrypt_user_pass)
                    break
                else:
                    print("Invalid password.")
            break
    else:
        print("Site Account not found.")

对于函数searchAndDecrypt,函数外部定义的变量是(站点-用户输入并保存在JSON文件中)(m_password =“Str@wb3rry!”)
我最初在代码中内置了一个错误消息,说明数据无法加密,但是在这里的一些人的建议下,我已经删除了它,看看出现的错误代码是什么。它只是响应我运行第二个函数。

File "/Users/makaylagalbraith/Documents/Python/PasswordManager.py", line 157, in <module>
    searchAndDecrypt()
  File "/Users/makaylagalbraith/Documents/Python/PasswordManager.py", line 91, in searchAndDecrypt
    decrypt_user_pass = k.decrypt(encrypted_password).decode('utf-8')
  File "/Users/makaylagalbraith/Library/Python/3.9/lib/python/site-packages/cryptography/fernet.py", line 90, in decrypt
    return self._decrypt_data(data, timestamp, time_info)
  File "/Users/makaylagalbraith/Library/Python/3.9/lib/python/site-packages/cryptography/fernet.py", line 151, in _decrypt_data
    self._verify_signature(data)
  File "/Users/makaylagalbraith/Library/Python/3.9/lib/python/site-packages/cryptography/fernet.py", line 135, in _verify_signature
    raise InvalidToken
cryptography.fernet.InvalidToken

我的密码被保存在代码的前面,像这样
这就是我创建密码/密钥的方式

key = Fernet.generate_key()
with open("key.key", "wb") as key_file:
    key_file.write(key)
k=Fernet(key)

它可能是关于我如何生成/保存它的东西吗?
任何帮助将不胜感激!

5m1hhzi4

5m1hhzi41#

我运行了你的代码,去掉了一些我不需要的东西,让它运行,它对我来说工作得很好。也许你没有正确地传递密码,或者它在解密之前发生了变化?

from cryptography.fernet import Fernet
import base64
import json

key = Fernet.generate_key()
cipher = Fernet(key)

#function to encrypt user entered password before dumping it into a JSON file
def encryptAndDump(username, password, k, dictionary):
    e_password = password.encode('utf-8')
    encrypted = k.encrypt(e_password)
    b64_encrypted = base64.b64encode(encrypted).decode('utf-8')
    a = {'site': [username, b64_encrypted]}
    try:
        with open(dictionary, 'r') as f:
            password_dictionary = json.load(f) 
    except FileNotFoundError:
        password_dictionary = {}
    password_dictionary.update(a)
    with open(dictionary, 'w') as f:
        json.dump(password_dictionary, f)

encryptAndDump('foo', 'bar', cipher, './test.json')

#function to search JSON file and decrypt password information
def searchAndDecrypt(dictionary, k):
    #r_site = input("Enter the Site Name to retrieve your credentials (Password Manager is case sensitive.): ")
    with open(dictionary, 'r') as f:
        password_dictionary = json.load(f) if f.readable() else {}
    for site, user_pass in password_dictionary.items():
        if site == 'site': #r_site:
            print("ACCOUNT FOUND") 
            while True:
                c_password = k #pwinput.pwinput("Confirm your Password Manager password to decrypt login credentials: ")
                #if c_password == m_password:
                b64_encrypted_password = user_pass[1]
                encrypted_password = base64.b64decode(b64_encrypted_password)
                decrypt_user_pass = k.decrypt(encrypted_password).decode('utf-8')
                print(decrypt_user_pass)
                break
                #else:
                 #   print("Invalid password.")
            break
    else:
        print("Site Account not found.")

searchAndDecrypt('./test.json', cipher)  # prints out 'bar'

请注意,我将site更改为一个名为'site'的字符串,并注解掉pwinput内容并添加了一些新参数。

相关问题