ファイル内のmd5をチェックし、md5が元のmd5と一致することを確認するコードをpythonで作成しました。私が開発したものは次のとおりです。
#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
コードに欠けているものはありますか?
あなたのエラーとあなたのコードに欠けているものに関して。 m
は、getmd5()
関数に対して定義されていない名前です。違反はありません。初心者であることは知っていますが、コードはいたるところにあります。問題を1つずつ見ていきましょう。最初に、hashlib.md5.hexdigest()
メソッドを正しく使用していません。 hashlib関数の説明をご覧ください Python Doc Library 。提供されたMD5を返す正しい方法 ひも このようなことをすることです:
>>> import hashlib
>>> hashlib.md5("filename.exe").hexdigest()
'2a53375ff139d9837e93a38a279d63e5'
ただし、ここで大きな問題があります。 MD5を計算しています ファイル名文字列、実際にはMD5はファイルに基づいて計算されます 内容。基本的にファイルの内容を読み取り、MD5を介してパイプする必要があります。次の例はあまり効率的ではありませんが、次のようなものです。
>>> import hashlib
>>> hashlib.md5(open('filename.exe','rb').read()).hexdigest()
'd41d8cd98f00b204e9800998ecf8427e'
明らかなように、2番目のMD5ハッシュは最初のものとはまったく異なります。その理由は、ファイル名だけでなく、ファイルのコンテンツをプッシュするためです。簡単な解決策は次のようなものです。
# 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!."
投稿をご覧ください Python:ファイルのMD5チェックサムの生成 効率的に達成する方法をいくつか説明します。
幸運を祈ります。