为什么密码在 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

希望对大家有所帮助,

菲尔