python - फ़ाइल के एमडी 5 चेकसम उत्पन्न करना




md5 checksum (2)

क्या Python में फ़ाइलों की सूची के MD5 चेकसम उत्पन्न करने (और जांचने) का कोई आसान तरीका है? (मेरे पास एक छोटा सा प्रोग्राम है जिस पर मैं काम कर रहा हूं, और मैं फ़ाइलों के चेकसम की पुष्टि करना चाहता हूं)।


आप hashlib.md5() उपयोग कर सकते हैं

ध्यान दें कि कभी-कभी आप पूरी फ़ाइल को स्मृति में फिट नहीं कर पाएंगे। उस स्थिति में, आपको अनुक्रमिक रूप से 4096 बाइट्स के हिस्सों को पढ़ना होगा और उन्हें एमडी 5 फ़ंक्शन पर फ़ीड करना होगा:

def md5(fname):
    hash_md5 = hashlib.md5()
    with open(fname, "rb") as f:
        for chunk in iter(lambda: f.read(4096), b""):
            hash_md5.update(chunk)
    return hash_md5.hexdigest()

एक तरीका है कि सुंदर स्मृति अक्षम है

एक दस्तावेज:

import hashlib
def file_as_bytes(file):
    with file:
        return file.read()

print hashlib.md5(file_as_bytes(open(full_path, 'rb'))).hexdigest()

फाइलों की सूची:

[(fname, hashlib.md5(file_as_bytes(open(fname, 'rb'))).digest()) for fname in fnamelst]

लेकिन, एमडी 5 टूटा हुआ है और (आईएमएचओ) डरावनी बहिष्करण चेतावनियों के साथ आना चाहिए और लाइब्रेरी से हटा दिया जाना चाहिए, तो यहां वास्तव में आपको यह कैसे करना चाहिए:

[(fname, hashlib.sha256(file_as_bytes(open(fname, 'rb'))).digest()) for fname in fnamelst]

यदि आप केवल 128 बिट्स पाचन के लायक चाहते हैं तो आप कर सकते हैं .digest()[:16]

यह आपको टुपल्स की एक सूची देगा, प्रत्येक टुपल जिसमें उसकी फ़ाइल का नाम और उसका हैश होगा।

फिर मैं दृढ़ता से एमडी 5 के उपयोग पर सवाल उठाता हूं। आपको कम से कम SHA1 का उपयोग करना चाहिए। कुछ लोग सोचते हैं कि जब तक आप 'क्रिप्टोग्राफिक' उद्देश्यों के लिए MD5 का उपयोग नहीं कर रहे हैं, तो आप ठीक हैं। लेकिन सामान की शुरूआत की तुलना में दायरे में व्यापक होने की प्रवृत्ति होती है, और आपका आकस्मिक भेद्यता विश्लेषण पूरी तरह से त्रुटिपूर्ण साबित हो सकता है। गेट के बाहर सही एल्गोरिदम का उपयोग करने की आदत में होना सबसे अच्छा है। यह सिर्फ अक्षरों का एक अलग समूह टाइप कर रहा है। यह इतना मुश्किल नही है।

यहां एक तरीका है जो अधिक जटिल है, लेकिन स्मृति कुशल है :

import hashlib

def hash_bytestr_iter(bytesiter, hasher, ashexstr=False):
    for block in bytesiter:
        hasher.update(block)
    return (hasher.hexdigest() if ashexstr else hasher.digest())

def file_as_blockiter(afile, blocksize=65536):
    with afile:
        block = afile.read(blocksize)
        while len(block) > 0:
            yield block
            block = afile.read(blocksize)


[(fname, hash_bytestr_iter(file_as_blockiter(open(fname, 'rb')), hashlib.md5()))
    for fname in fnamelst]

और, फिर से, चूंकि एमडी 5 टूटा हुआ है और वास्तव में कभी भी इसका उपयोग नहीं किया जाना चाहिए:

[(fname, hash_bytestr_iter(file_as_blockiter(open(fname, 'rb')), hashlib.sha256()))
    for fname in fnamelst]

फिर, आप [:16] को hash_bytestr_iter(...) कॉल करने के बाद डाल सकते हैं यदि आप केवल 128 बिट्स पाचन के लायक चाहते हैं।





hashlib