簡體   English   中英

在 python 中作為字節對象傳遞時,為什么密碼不能在 s3 中打開我的 zip 文件?

[英]Why doesn't the password open my zip file in s3 when passed as a bytes object in python?

我有一個小但神秘且無法解決的問題,使用 python 在 AWS S3 存儲桶中打開受密碼保護的文件。

我得到的密碼絕對正確,我可以將 zip 下載到 Windows 並將其解壓縮以顯示我需要的 csv 數據。 但是我需要編寫一個過程來定期將此數據加載到數據庫中。

密碼具有這樣的模式(包括混合大小寫字母、數字和單個“@”):-

ABCD@Efghi12324567890

下面的代碼適用於我放置在具有相同密碼的位置的其他 zip 文件:-

import boto3
import pyzipper
from io import BytesIO

s3_resource = boto3.resource('s3', aws_access_key_id=aws_access_key_id, aws_secret_access_key=aws_secret_access_key)
zip_obj = s3_resource.Object(bucket_name=my_bucket, key=my_folder + my_zip)
buffer = BytesIO(zip_obj.get()["Body"].read())
z = pyzipper.ZipFile(buffer)
my_newfile=z.namelist()[0]
s3_resource.meta.client.upload_fileobj(
    z.open(my_newfile, pwd=b"ABCD@Efghi12324567890"), #HERE IS THE OPEN COMMAND
    Bucket=my_bucket,
    Key=my_folder + my_newfile)

我被告知密碼不正確:-

RuntimeError: Bad password for file 'ThisIsTheFileName.csv'

我求助於使用 pyzipper 而不是 zipfile,因為 zipfile 不支持相關文件的壓縮方法:-

That compression method is not supported

在 7-zip 中,我可以看到 zip 文件的以下內容:-

Method: AES-256 Deflate
Characteristics: WzAES: Encrypt
Host OS: FAT

所以要確認:-
- 密碼絕對正確(可以手動打開)
- 代碼看起來沒問題 - 它用相同的密碼打開我的 zip 文件

請問這里有什么問題,我該如何解決?

你會得到我真誠的感謝!

菲爾

在一位同事和一篇有用的文章的幫助下,我現在可以進行這項工作。

首先,根據壓縮類型,我發現有必要使用 pyzipper 的 AESZipFile() 方法(盡管此方法似乎也適用於其他壓縮類型)。

其次 AESZipFile() 方法顯然接受一個 BytesIO 對象以及一個文件路徑,大概是因為這是它打開文件時看到的。 因此,無需先下載即可原位提取 zip 文件。

此方法創建 pyzipper 對象,然后您可以通過指定文件名和密碼來讀取該對象。

最終代碼如下所示:-

import pyzipper
import boto3
from io import BytesIO

my_bucket = ''
my_folder = ''
my_zip = ''
my_password = b''
aws_access_key_id=''
aws_secret_access_key=''

s3 = boto3.client('s3', aws_access_key_id=aws_access_key_id, aws_secret_access_key=aws_secret_access_key)
s3_file = s3.get_object(Bucket=my_bucket, Key=my_folder + my_zip)
s3_iodata = BytesIO(s3_file['Body'].read())
f = pyzipper.AESZipFile(s3_iodata)
my_file = f.namelist()[0]
file_content = f.read(my_file, pwd = my_password)
response = s3.put_object(Body=file_content, Bucket=my_bucket, Key=my_folder + my_file)

這是一篇有用的文章:-
https://www.linkedin.com/pulse/extract-files-from-zip-archives-in-situ-aws-s3-using-python-tom-reid

我希望這對某人有幫助

菲爾

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM