Используйте PGP для расшифровки файла, хранящегося на сервере SFTP, с помощью Python - PullRequest
1 голос
/ 14 июля 2020

У меня есть SFTP, который я установил с файлами * .PGP на этом сервере. Пакет, который я использую для подключения к SFTP из python, - это Paramiko, как показано ниже.

import paramiko

transport = paramiko.Transport(json_data["host"], 22)
transport.connect(username=json_data["username"], password=json_data["password"])
sftp = paramiko.SFTPClient.from_transport(transport)

Кроме того, я использую pgpy для дешифрования сообщения. В основном ключ поступает из ведра облачного хранилища Google и загружает его в цепочку для ключей и расшифровывает файл

Я уже настроил эту расшифровку для локального файла, но не могу понять, как расшифровать сообщение на сервере.

Я не могу использовать функцию get, потому что я буду запускать этот код в облачных функциях Google, поэтому не смогу получить доступ к локальному каталогу.

Is в любом случае я могу загрузить файл в Python, расшифровать файл, а затем загрузить его в Pandas. Конечный файл - это файл .CSV.

Фактический код, используемый для дешифрования локальных файлов.

import pgpy
key = pgpy.PGPKey().from_file("path/to/file/keyfile.asc")

with key[0].unlock("password") as ukey:
    message = pgpy.PGPMessage().from_file("path/to/file/file.pgp")
    f = ukey.decrypt(message).message
    print(f)

Это позволит расшифровать сообщение локально.

Ответы [ 2 ]

1 голос
/ 19 июля 2020

У вас должна быть возможность загрузить файл с сервера SFTP в память (например, в объект BytesIO). А затем используйте PGPMessage().from_blob.

Примерно так (непроверено):

with io.BytesIO() as fl:
    sftp.getfo(file_name, fl)
    fl.seek(0)
    bytes = fl.read()
    message = pgpy.PGPMessage().from_blob(bytes)
0 голосов
/ 24 июля 2020

Я понял, как это сделать через некоторое время. Подготовьте входящие данные из SFTP

x = sftp.open("File.csv.pgp", 'rb').read()
    toread = io.BytesIO()
    toread.write(x)
    toread.seek(0)

, затем Импортируйте ключевую шахту из облачного хранилища Google и откройте ключ

with gcsfs.GCSFileSystem(project="proj").open('path/to/*.asc','rb') as token:
   creds = pgpy.PGPKey().from_blob(token.read())#load key
   with creds[0].unlock("pass") as ukey:
       message = pgpy.PGPMessage().from_blob(toread.read())#load file body
       decryptedmessage = ukey.decrypt(message).message#decryt file body
       decryptedmessagestr = decryptedmessage.decode()#decode bytes
       DMIo = io.StringIO(decryptedmessagestr)#convert decoded bytes to string
       dataframe = pd.read_csv(DMIo) #insert into pandas
...