Сравнение хеша Python MD5 в Python 3.2 - PullRequest
4 голосов
/ 02 мая 2011

Я пытаюсь проверить два файла, загруженных с сервера.Первый содержит данные, а второй - контрольную сумму хеша 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) = b60d684ab4a2570253961c2c2ad7b14c\n'
[0] b60d684ab4a2570253961c2c2ad7b14c

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

Спасибо.

Ответы [ 4 ]

1 голос
/ 02 мая 2011

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

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

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

1 голос
/ 02 мая 2011

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

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

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

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

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

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

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

if fileHash.encode() in fileHandleData:
0 голосов
/ 14 марта 2013

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

0 голосов
/ 02 мая 2011

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

...