2013-06-01 28 views
41

Zrobiłem kod w python, który sprawdza md5 w pliku i upewnia się, że md5 pasuje do oryginału. Oto co opracowali:Jak obliczyć sumę kontrolną md5 pliku w Pythonie?

#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 

Ale ilekroć uruchomić kod, mam następujące:

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 

Czy coś mi brakuje w moim kodu?

+0

możliwe duplikat [Generowanie kontrolną MD5 pliku?] (Http://stackoverflow.com/questions/3431825/generating-a-md5-checksum-of-a-file) – pylover

Odpowiedz

108

Co do Twojego błędu i czego brakuje w kodzie. m to nazwa, która nie została zdefiniowana dla funkcji getmd5(). Bez urazy, wiem, że jesteś początkujący, ale twój kod jest wszędzie. Spójrzmy na twoje problemy jeden po drugim :) Po pierwsze, nie używasz poprawnie metody hashlib.md5.hexdigest(). Proszę znaleźć wyjaśnienie na temat funkcji haslib Python Doc Library. Poprawny sposób, aby powrócić do przewidzianego MD5 ciąg jest zrobić coś takiego:

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

jednak masz większy problem. Obliczasz MD5 na łańcuchu nazw plików , gdzie w rzeczywistości MD5 jest obliczany na podstawie pliku zawartość. Będziesz musiał zasadniczo przeczytać zawartość pliku i potokować go za pomocą md5. Mój następny przykład nie jest bardzo wydajny, ale coś takiego:

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

Jak można wyraźnie zobaczyć drugi MD5 hash jest zupełnie inny od pierwszego. Powodem tego jest to, że przesyłamy zawartość pliku, a nie tylko nazwę pliku. Prostym rozwiązaniem mogłoby być coś takiego:

# 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 orginal_md5 == md5_returned: 
    print "MD5 verified." 
else: 
    print "MD5 verification failed!." 

Proszę spojrzeć na stanowisku Python: Generating a MD5 checksum of a file to opisuje w kilku sposobów, w jaki sposób można skutecznie osiągnąć.

Powodzenia.

+0

wow. Czuję się zawstydzony. Zgaduję, że podałem zły kod dla tego, co robiłem i dodałem wiele błędów wraz z nim. Dzięki za pomoc. Jestem jednak bardziej przyzwyczajony do partii i lua. Tak więc Python jest dla mnie wybredny. – user2344996

+10

Powinieneś również otworzyć plik w trybie binarnym z otwartym (nazwa_pliku,'rb '), w przeciwnym razie możesz napotkać problemy, gdy os wykona konwersję z powrotem na nową linię/karetkę. Zobacz https://mail.python.org/pipermail/tutor/2004-January/027634.html i http://stackoverflow.com/questions/3431825/python-generating-a-md5-checksum-of-a-file ? rq = 1 – twobeers

+3

Jeśli pracujesz nad plikiem binarnym, upewnij się, że czytasz go poprawnie w trybie "b", w końcu sprawię, że będzie działał zgodnie z oczekiwaniami: hashlib.sha512 (open (fn, 'rb'). read()). hexdigest() –

Powiązane problemy