Python3-如何读取一个字节值字符串并将其重新编码为字节



我正在开发一个工具,该工具使用十六进制API键将用户登录到远程托管工具中。出于安全考虑,我使用Fernet在本地加密密钥,并将其存储在文本文件中,这样用户就不必每次都输入密钥。我们需要解密API密钥,这样用户就可以登录。问题是,我正在从文本文件加载密钥,当我将字符串数据传递回Fernet时,会出现以下错误:

ValueError: Fernet key must be 32 url-safe base64-encoded bytes.

知道我做错了什么吗?以下是我的功能:

# This function generates the local key file
def key_gen(access_key, secret_key):
from os import getcwd
from cryptography.fernet import Fernet
file_data = []
key = Fernet.generate_key()
encrypted_ak = encrypt_data(access_key, key)
encrypted_sk = encrypt_data(secret_key, key)
current_dir = getcwd()
key_file = current_dir + "\tenableauth.txt"
file_data.append(key)
file_data.append(encrypted_ak)
file_data.append(encrypted_sk)
with open(key_file, 'w') as authentication_file:
for line in file_data:
authentication_file.writelines(str(line) + "n")
return key_file
# This function reads the local key file, and is where I'm hitting problems. Lots of test code here.
def read_keys(file):
file_lines = []
with open(file, 'r') as authentication_file:
for line in authentication_file:
file_lines.append(line)
encryption_key = file_lines[0]
encryption_key = encryption_key.rstrip()
print(encryption_key)
print(repr(encryption_key))
decrypted_ak = decrypt_data(file_lines[1], encryption_key)
print(decrypted_ak)
def encrypt_data(data, key):
from cryptography.fernet import Fernet
data = data.encode()
encrypted_string = Fernet(key).encrypt(data)
return encrypted_string
def decrypt_data(data, key):
from cryptography.fernet import Fernet
decrypted_string = Fernet(key).decrypt(data)
return decrypted_string

这样的错误意味着您混合和匹配了strbytes object类型,同时在类型之间错误地编码/解码

我更新了strbytes object类型之间的代码处理,如下所示

# This function generates the local key file
def key_gen(access_key, secret_key):
from os import getcwd
from cryptography.fernet import Fernet
file_data = []
key = Fernet.generate_key()
encrypted_ak = encrypt_data(access_key, key)
encrypted_sk = encrypt_data(secret_key, key)
print(f"key {key}")
print(f"encrypted_sk {encrypted_sk}")
print(f"encrypted_ak {encrypted_ak}")
key_file = "tenableauth.txt"
file_data.append(key.decode('utf-8'))
file_data.append(encrypted_ak.decode('utf-8'))
file_data.append(encrypted_sk.decode('utf-8'))
with open(key_file, 'w') as authentication_file:
for line in file_data:
authentication_file.write(line + 'n')
return key_file
# This function reads the local key file, and is where I'm hitting problems. Lots of test code here.
def read_keys(file):
file_lines = []
with open(file, 'r') as authentication_file:
for line in authentication_file:
file_lines.append(line.encode('utf-8').rstrip())
key = file_lines[0]
encrypted_ak = file_lines[1]
encrypted_sk = file_lines[2]
print(f"key {key}")
print(f"encrypted_sk {encrypted_sk}")
print(f"encrypted_ak {encrypted_ak}")
decrypted_ak = decrypt_data(encrypted_ak, key)
print(decrypted_ak)
def encrypt_data(data, key):
from cryptography.fernet import Fernet
data = data.encode()
encrypted_string = Fernet(key).encrypt(data)
return encrypted_string
def decrypt_data(data, key):
from cryptography.fernet import Fernet
decrypted_string = Fernet(key).decrypt(data)
return decrypted_string

使用我添加的print语句,调用key_gen("yadayada", "hoho!!")将打印

key b'BtP8iJwhWqfxX6i_HwSbRASh04w3V0Ypp-M2Ic23Xlc='
encrypted_sk b'gAAAAABf67lG1a_zotxaxeG3mR6sXIgQF6jtsS6Nt8FWP7EI2f73dtBLCwWBE9fTGvEHml_ivcKxSMUjMOgOWjGSOM0uTLSDCw=='
encrypted_ak b'gAAAAABf67lGphAR1gq65o_RB2cg-o5dCLICW7o8LceKAiTEP1N4nSqlqW9pSaLumxm6CeI4bwfirSZvPDPtUtlVMeCREttvTg=='

并且在反向调用read_keys('tenableauth.txt')时打印

key b'BtP8iJwhWqfxX6i_HwSbRASh04w3V0Ypp-M2Ic23Xlc='
encrypted_sk b'gAAAAABf67lG1a_zotxaxeG3mR6sXIgQF6jtsS6Nt8FWP7EI2f73dtBLCwWBE9fTGvEHml_ivcKxSMUjMOgOWjGSOM0uTLSDCw=='
encrypted_ak b'gAAAAABf67lGphAR1gq65o_RB2cg-o5dCLICW7o8LceKAiTEP1N4nSqlqW9pSaLumxm6CeI4bwfirSZvPDPtUtlVMeCREttvTg=='
b'yadayada'

最后一行输出是传递的密钥b'yadayada'

最新更新