পাইথনের কোনও ফাইলের MD5 চেকসাম কীভাবে গণনা করব?


90

আমি পাইথনে এমন একটি কোড তৈরি করেছি যা কোনও ফাইলে এমডি 5 পরীক্ষা করে এবং নিশ্চিত করে যে MD5 মূলটির সাথে মেলে।

আমি যা বিকাশ করেছি তা এখানে:

#Defines filename
filename = "file.exe"

#Gets MD5 from file 
def getmd5(filename):
    return m.hexdigest()

md5 = dict()

for fname in filename:
    md5[fname] = getmd5(fname)

#If statement for alerting the user whether the checksum passed or failed

if md5 == '>md5 will go here<': 
    print("MD5 Checksum passed. You may now close this window")
    input ("press enter")
else:
    print("MD5 Checksum failed. Incorrect MD5 in file 'filename'. Please download a    new copy")
    input("press enter") 
exit

তবে যখনই আমি কোডটি চালাই, আমি নিম্নলিখিত ত্রুটিটি পাই:

Traceback (most recent call last):
File "C:\Users\Username\md5check.py", line 13, in <module>
 md5[fname] = getmd5(fname)
File "C:\Users\Username\md5check.py, line 9, in getmd5
  return m.hexdigest()
NameError: global name 'm' is not defined

আমার কোডটিতে আমি কি অনুপস্থিত কিছু আছে?

ধন্যবাদ


উত্তর:


210

আপনার ত্রুটি সম্পর্কিত এবং আপনার কোডটিতে কী অনুপস্থিত রয়েছে reg mএকটি নাম যা getmd5()ফাংশনের জন্য সংজ্ঞায়িত হয় না ।

কোনও অপরাধ নয়, আমি জানি আপনি একজন শিক্ষানবিস, তবে আপনার কোডটি পুরো জায়গা জুড়ে। আসুন এক এক করে আপনার সমস্যাগুলি দেখুন:

প্রথমত, আপনি hashlib.md5.hexdigest()পদ্ধতিটি সঠিকভাবে ব্যবহার করছেন না । পাইথন ডক লাইব্রেরিতে হ্যাশলিব ফাংশন সম্পর্কিত ব্যাখ্যা উল্লেখ করুন । প্রদত্ত স্ট্রিংয়ের জন্য MD5 ফিরিয়ে দেওয়ার সঠিক উপায় হ'ল এরকম কিছু করা:

>>> import hashlib
>>> hashlib.md5("filename.exe").hexdigest()
'2a53375ff139d9837e93a38a279d63e5'

তবে আপনার এখানে আরও বড় সমস্যা রয়েছে। আপনি একটি ফাইলের নাম স্ট্রিংয়ে MD5 গণনা করছেন, যেখানে বাস্তবে MD5 ফাইলের সামগ্রীর উপর ভিত্তি করে গণনা করা হয় । আপনাকে মূলত ফাইলের সামগ্রীগুলি পড়তে হবে এবং এটি MD5 হলেও পাইপ করতে হবে। আমার পরবর্তী উদাহরণটি খুব দক্ষ নয়, তবে এর মতো কিছু:

>>> import hashlib
>>> hashlib.md5(open('filename.exe','rb').read()).hexdigest()
'd41d8cd98f00b204e9800998ecf8427e'

আপনি পরিষ্কারভাবে দেখতে পাচ্ছেন দ্বিতীয় এমডি 5 হ্যাশ প্রথমটির থেকে সম্পূর্ণ আলাদা। এর কারণ হ'ল আমরা কেবল ফাইলের নাম নয়, ফাইলের বিষয়বস্তুগুলি দিয়ে যাচ্ছি।

একটি সহজ সমাধান এর মতো কিছু হতে পারে:

# Import hashlib library (md5 method is part of it)
import hashlib

# File to check
file_name = 'filename.exe'

# Correct original md5 goes here
original_md5 = '5d41402abc4b2a76b9719d911017c592'  

# Open,close, read file and calculate MD5 on its contents 
with open(file_name) as file_to_check:
    # read contents of the file
    data = file_to_check.read()    
    # pipe contents of the file through
    md5_returned = hashlib.md5(data).hexdigest()

# Finally compare original MD5 with freshly calculated
if original_md5 == md5_returned:
    print "MD5 verified."
else:
    print "MD5 verification failed!."

দয়া করে পাইথন পোস্টটি দেখুন : একটি ফাইলের MD5 চেকসাম তৈরি করা হচ্ছে । এটি দক্ষতার সাথে কীভাবে অর্জন করা যায় তার কয়েকটি উপায় সম্পর্কে বিস্তারিতভাবে ব্যাখ্যা করা হয়েছে।

শুভকামনা করছি.


4
কি দারুন. আমি খুব বিব্রত বোধ করছি। আমি অনুমান করি যে আমি যা করছিলাম তার জন্য আমি ভুল কোড রেখেছি এবং এটির সাথে অনেকগুলি ভুলও যুক্ত করেছি। আপনার সাহায্যের জন্য ধন্যবাদ. যদিও আমি ব্যাচ এবং লুয়াতে বেশি অভ্যস্ত। তাই পাইথন আমার পক্ষে পছন্দসই।
ব্যবহারকারী 2344996

20
আপনার ওপেন (ফাইল_নাম, 'আরবি') দিয়ে বাইনারি মোডে ফাইলটি ওপেন করা উচিত, অন্যথায় যখন ওএস নিউলাইন / ক্যারেজ ফেরত রূপান্তরগুলি করে তখন আপনি সমস্যা পেতে পারেন। দেখুন mail.python.org/pipermail/tutor/2004-January/027634.html এবং stackoverflow.com/questions/3431825/...
twobeers

4
আপনি যদি বাইনারি ফাইলটিতে কাজ করেন তবে নিশ্চিত হয়ে নিন যে আপনি এটি 'বি' মোডের সাথে সঠিকভাবে পড়েছেন, শেষ পর্যন্ত আমি এটির সাথে প্রত্যাশা অনুযায়ী এটি কাজ করি: hashlib.sha512 (উন্মুক্ত (fn, 'rb') পড়ুন ()) hexdigest ()
জেমি লি

13

পাইথন ৩.৮++ এ আপনি করতে পারেন

import hashlib

with open("your_filename.png", "rb") as f:
    file_hash = hashlib.md5()
    while chunk := f.read(8192):
        file_hash.update(chunk)

print(file_hash.digest())
print(file_hash.hexdigest())  # to get a printable str instead of bytes

পাইথন ৩.7 এবং নীচে:

with open("your_filename.png", "rb") as f:
    file_hash = hashlib.md5()
    chunk = f.read(8192)
    while chunk:
        file_hash.update(chunk)
        chunk = f.read(8192)

print(file_hash.hexdigest())

এটি f.read()কম স্মৃতি ব্যবহারের জন্য একবারে একবারের পরিবর্তে একবারে 8192 (বা 2¹³) ফাইলটি পড়ে ।


hashlib.blake2bপরিবর্তে md5(কেবল উপরের স্নিপেটগুলির md5সাথে প্রতিস্থাপন করুন) ব্যবহার করার কথা বিবেচনা করুন blake2b। এটি ক্রিপ্টোগ্রাফিকভাবে সুরক্ষিত এবং MD5 এর চেয়ে দ্রুত


-2

বাইনারি ডেটা পড়ে এবং ব্যবহার করে আপনি কোনও ফাইলের চেকসাম গণনা করতে পারেন hashlib.md5().hexdigest()। এটি করার জন্য একটি ক্রিয়াকলাপ নিম্নলিখিতগুলির মতো দেখাবে:

def File_Checksum_Dis(dirname):
    
    if not os.path.exists(dirname):
        print(dirname+" directory is not existing");
    
    for fname in os.listdir(dirname):
        if not fname.endswith('~'):
            fnaav = os.path.join(dirname, fname);
            fd = open(fnaav, 'rb');
            data = fd.read();
            fd.close();
        
            print("-"*70);
            print("File Name is: ",fname);          
            print(hashlib.md5(data).hexdigest())
            print("-"*70);
                
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.