创建一个有密码保护的zip文件?

10

我正在使用以下代码在我的Python34应用程序中使用zipFile从用户上传的文件创建密码保护的压缩文件。但是当我在Windows上打开压缩文件时,它不会要求输入密码。以后我将使用相同的密码从Python中读取zip文件。我做错了什么?

这是我的代码:

pwdZipFilePath = uploadFilePath + "encryptedZipFiles/"
filePath = uploadFilePath

if not os.path.exists(pwdZipFilePath):        
      os.makedirs(pwdZipFilePath)

#save csv file to a path
fd, filePath = tempfile.mkstemp(suffix=source.name, dir=filePath)

with open(filePath, 'wb') as dest:
    shutil.copyfileobj(source, dest)

#convert that csv to zip
fd, pwdZipFilePath = tempfile.mkstemp(suffix=source.name + ".zip", dir=pwdZipFilePath)

with zipfile.ZipFile(pwdZipFilePath, 'w') as myzip:
    myzip.write(filePath)

    myzip.setpassword(b"tipi")

你能够真正地访问文件吗?还是只能看到它?在zip密码保护中,这是一种常见的行为,即您实际上可以看到文件,尽管它受到密码保护。 - user1767754
@user1767754 是的,我也可以访问压缩文件中的文件。我甚至打开了它。如果密码只是为了打开它,那么设置密码有什么意义呢? - Tahreem Iqbal
@Galen 我不这么认为。我已经检查了这个网站上的所有相关问题,但仍然遇到问题。 - Tahreem Iqbal
2个回答

15

内置的zipfile模块不支持编写密码加密的文件(仅支持读取)。您可以使用pyminizip

import pyminizip
pyminizip.compress("dummy.txt", "myzip.zip", "noneshallpass", compression_level)

或者,如果您使用的是Windows/msysgit,并且对格式不加区分:

import os
os.system('tar cz dummy.txt | openssl enc -aes-256-cbc -e -k noneshallpass > mypacked.enc')
os.remove('dummy.txt')
os.system('openssl enc -aes-256-cbc -d -k noneshallpass -in mypacked.enc | tar xz')

我刚刚读了setPassword,过了一会儿才意识到这是用于在写入之前进行设置。 - user1767754
@user1767754,你完全没有仔细阅读。请查看Galen的回答。 - Jonas Byström
我实际上是指相反的“在阅读之前”,并想强调第一个期望是,当阅读时可以设置zip文件的密码,而不是在阅读时应用密码。 - user1767754
无法在Windows上安装pyminizip。错误:需要Microsoft Visual C++ 9.0。请从http://aka.ms/vcpython27获取。 - Mostafa
Windows 10 22H2(或者至少我的机器)在system32目录下有tar,但没有openssl。 - aaaantoine

13
zipfile文档中指出:ZipFile.setpassword可以设置“解压加密文件的默认密码”。
在文档的开头,有这样一句话:“它支持解密ZIP归档中的加密文件,但目前无法创建加密文件。”
编辑: 要创建密码保护的ZIP文件,请尝试使用类似pyminizip的软件包。

1
好的,那么我如何在Python中创建一个带密码保护的zip文件呢?我已经查阅了其他解决方案,但它们并没有提供帮助。 - Tahreem Iqbal
我会看一下像pyminizip这样的包。 - Galen
好的,我会研究一下。谢谢。 - Tahreem Iqbal
我一开始以为他是先写文件再设置密码,但震惊地意识到setpassword有点弱。但在一些书籍参考中,如《Python 简明教程》,他们展示了如何使用setpassword来防止字典攻击。 - user1767754
1
zipfile 的文档说明:它支持解密 ZIP 存档中的加密文件,但目前无法创建加密文件。由于实现方式是使用原生 Python 而不是 C,所以解密速度非常慢。
  • 这个模块是否适合使用?
- Ron Kalian
pyminizip不支持内存文件。如果您需要内存功能,请使用pyzipper。 - goodgrief

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接