Сравнение хэша Python MD5 в Python 3.2



Я пытаюсь проверить два файла, загруженных с сервера. Первый содержит данные,а второй файл содержит контрольную сумму MD5-хэша.



Я создал функцию, которая возвращает hexdigest из файла данных следующим образом:



def md5(fileName):
"""Compute md5 hash of the specified file"""
try:
fileHandle = open(fileName, "rb")
except IOError:
print ("Unable to open the file in readmode: [0]", fileName)
return
m5Hash = hashlib.md5()
while True:
data = fileHandle.read(8192)
if not data:
break
m5Hash.update(data)
fileHandle.close()
return m5Hash.hexdigest()


Я сравниваю файлы, используя следующее:



file = "/Volumes/Mac/dataFile.tbz"
fileHash = md5(file)

hashFile = "/Volumes/Mac/hashFile.tbz.md5"
fileHandle = open(hashFile, "rb")
fileHandleData = fileHandle.read()

if fileHash == fileHandleData:
print ("Good")
else:
print ("Bad")


Сравнение файлов не удается, поэтому я распечатал оба fileHash и fileHandleData, и я получаю следующее:



[0] b'MD5 (hashFile.tbz) = b60d684ab4a2570253961c2c2ad7b14cn'
[0] b60d684ab4a2570253961c2c2ad7b14c


Из выходных данных выше хэш-значения идентичны. Почему происходит сравнение хэшей потерпеть неудачу? Я новичок в python и использую python 3.2. Есть предложения?



Спасибо.

753   4  

4 ответов:

Сравнение не удается по той же причине, что это ложно:

a = "data"
b = b"blah (blah) - data"
print(a == b)

Формат этого файла. md5 странный, но если он всегда находится в этом формате, простой способ проверить будет:

if fileHandleData.rstrip().endswith(fileHash.encode()):

Поскольку у вас есть файловый хэш в виде строки (Unicode), вы должны кодировать его в байты для сравнения. Вы можете указать кодировку, а не использовать текущую строковую кодировку по умолчанию.

Если этот точный формат всегда ожидается, было бы более надежным использовать регулярное выражение для извлечения значение хэша и, возможно, проверить имя файла.

Или, более гибко, вы можете проверить наличие подстроки:

if fileHash.encode() in fileHandleData:

Вы сравниваете хэш-значение с содержимым fileHandle. Вам нужно избавиться от части MD5 (hashFile.tbz) =, а также от завершающей новой строки, поэтому попробуйте:

if fileHash == fileHandleData.rsplit(' ', 1)[-1].rstrip():
    print ("Good")
else:
    print ("Bad")

Имейте в виду, что в Python 3, rsplit() и rstrip() не поддерживают API буфера и работают только со строками. Следовательно, Как правильно добавил Фред Нурк, вам также нужно кодировать / декодировать fileHandleData/fileHash (байтовый буфер или строку (Unicode) соответственно).

Хэш-значения идентичны, но строки-нет. Вам нужно получить шестнадцатеричное значение дайджеста, и вам нужно разобрать хэш из файла. Как только вы сделаете это, вы можете сравнить их для равенства.

Попробуйте "fileHash.полоса ("\n")...затем сравните их. Это должно решить проблему.

Comments

    Ничего не найдено.