मेरे पास एक एन्क्रिप्टेड ज़िप फ़ाइल है और किसी कारण से, मैं जो भी पासवर्ड खिलाता हूं, वह कोई मायने नहीं रखता क्योंकि यह संग्रह में फ़ाइलों को जोड़ सकता है। मैंने किसी भी अनदेखा अपवाद या कुछ भी चेक किया है, लेकिन कुछ भी स्पष्ट रूप से स्पष्ट नहीं लगता है।

मैंने नीचे न्यूनतम कोड पोस्ट किया है।

import zipfile
z = zipfile.ZipFile('test.zip', 'a') #Set zipfile object
zipPass = str(input("Please enter the zip password: "))
zipPass = bytes(zipPass, encoding='utf-8')
z.setpassword(zipPass) #Set password
z.write("test.txt")

मुझे यकीन नहीं है कि मैं यहां क्या खो रहा हूं, लेकिन मैं ज़िपफाइल में कुछ भी ढूंढ रहा था जो एन्क्रिप्टेड ज़िपफाइल को संभाल सकता है और पासवर्ड का उपयोग करके फाइलों को जोड़ सकता है, क्योंकि मेरे पास केवल एक चीज है z.setpassword() फ़ंक्शन जो लगता है यहाँ काम नहीं।

TL; DR: z.write() कोई अपवाद नहीं फेंकता है और न ही z.setpassword() या कुछ भी zipfile संबंधित है जब गलत पासवर्ड दिया जाता है, और स्वेच्छा से फ़ाइलें जोड़ता है चाहे कुछ भी हो। मैं BadPasswordForFile प्राप्त करने की उम्मीद कर रहा था?

क्या इसे करने का कोई तरीका है?

धन्यवाद।

1
Maybe LB Did It 6 पद 2020, 00:45

2 जवाब

सबसे बढ़िया उत्तर

सभी प्यारे उत्तरों के बाद, मुझे इसके लिए एक समाधान मिल गया, अगर किसी को उत्तर की आवश्यकता हो!

मैंने पहले z.testzip() का पुन: प्रयास किया और यह वास्तव में खराब पासवर्ड को पकड़ता है, लेकिन यह देखने के बाद कि यह विश्वसनीय नहीं था (जाहिरा तौर पर हैश टकराव जो खराब पासवर्ड को किसी छोटे हैश से मेल खाने की अनुमति देता है), मैंने इसका उपयोग करने का निर्णय लिया पासवर्ड, संग्रह में दिखाई देने वाली पहली फ़ाइल को निकालें, और फिर उसे निकालें। यदि यह काम करता है, तो निकाली गई फ़ाइल को हटा दें, और यदि ऐसा नहीं होता है, तो कोई नुकसान नहीं हुआ है।

कोड नीचे के रूप में काम करता है:

try:
    z = zipfile.ZipFile(fileName, 'a') #Set zipfile object
    zipPass = bytes(zipPass, encoding='utf-8') #Str to Bytes
    z.setpassword(zipPass) #Set password
    filesInArray = z.namelist() #Get all files
    testfile = filesInArray[0] #First archive in list
    z.extract(testfile, pwd=zipPass) #Extract first file
    os.remove(testfile) #remove file if successfully extracted
except Exception as e:
    print("Exception occurred: ",repr(e))
    return None #Return to mainGUI - this exits the function without further processing

टिप्पणियों और उत्तरों के लिए धन्यवाद दोस्तों!

0
Maybe LB Did It 11 पद 2020, 21:56

मैंने zipfile के दस्तावेज़ीकरण में पाया कि पुस्तकालय केवल पासवर्ड के साथ डिक्रिप्शन का समर्थन करता है। यह एन्क्रिप्ट नहीं कर सकता। इसलिए आप पासवर्ड के साथ फाइल नहीं जोड़ पाएंगे।

यह ज़िप अभिलेखागार में एन्क्रिप्टेड फ़ाइलों के डिक्रिप्शन का समर्थन करता है, लेकिन यह वर्तमान में एक एन्क्रिप्टेड फ़ाइल नहीं बना सकता है। https://docs.python.org/3/library/zipfile.html

संपादित करें: इसके अलावा, पायथन बग्स समस्या 34546: ज़िपफाइल में एन्क्रिप्शन समर्थन जोड़ें को देखते हुए ऐसा प्रतीत होता है कि ऐसा करने के लिए ज़िप में उपयोग की जाने वाली कमजोर पासवर्ड योजना को कायम नहीं रखा, उन्होंने इसे शामिल नहीं करने का विकल्प चुना।

पासवर्ड के साथ फ़ाइलें जोड़ने के लिए आप subprocess का उपयोग कर सकते हैं। इसके अलावा, यदि आप पहले दर्ज किए गए पासवर्ड को "मान्य" करना चाहते हैं, तो आप ऐसा कुछ कर सकते हैं, लेकिन आपको फ़ाइल की सामग्री को जानना होगा क्योंकि डिक्रिप्ट किसी भी पासवर्ड के साथ किसी भी फाइल को खुशी से डिक्रिप्ट कर देगा, प्लेनटेक्स्ट परिणाम बस नहीं होगा सही।

जिन मुद्दों को आपको हल करना होगा:

  • पासवर्ड सत्यापित करने के लिए फ़ाइल सामग्री की तुलना करना
  • जब कोई फ़ाइल ज़िप फ़ाइल में पहले से मौजूद हो, तो उसे संभालना
  • संभालना जब ज़िपफाइल पहले से मौजूद है और जब यह नहीं है।
import subprocess
import zipfile

def zip_file(zipFilename, filename):
    zipPass = str(input("Please enter the zip password: "))
    zipPass = bytes(zipPass, encoding='utf-8')

    #If there is a file that we know the plain-text (or original binary)
    #TODO: handle fipFilename not existing.
    validPass=False
    with zipfile.ZipFile(zipFilename, 'r') as zFile:
        zFile.setpassword(zipPass)
        with zFile.open('known.txt') as knownFile:
            #TODO: compare contents of known.txt with actual
            validPass=True

    #Next to add file with password cannot use zipfile because password not supported
    # Note this is a linux only solution, os dependency will need to be checked
    #if compare was ok, then valid password?
    if not validPass:
        print('Invalid Password')
    else:
        #TODO: handle zipfile not-exist and existing may have to pass
        #      different flags.
        #TODO: handle filename existing in zipFilename
        #WARNING the linux manual page for 'zip' states -P is UNSECURE. 
        res = subprocess.run(['zip', '-e', '-P', zipPass, zipFilename, filename])
        #TODO: Check res for success or failure.

संपादित करें: मैंने -P के साथ संपूर्ण "उजागर पासवर्ड" समस्या को ठीक करने पर ध्यान दिया। दुर्भाग्य से, यह गैर तुच्छ है। आप केवल zipPass को subprocess.run के स्टड में input= के साथ नहीं लिख सकते। मुझे लगता है कि pexpect जैसा कुछ इसका समाधान हो सकता है, लेकिन मैंने उस काम को करने के लिए समय नहीं बिताया है। इसे पूरा करने के लिए pexpect का उपयोग करने के उदाहरण के लिए यहां देखें: उपप्रक्रिया का उपयोग करें पासवर्ड भेजें_

2
Tom Myddeltyn 8 पद 2020, 00:24