2011-05-02 92 views
3

我想驗證從服務器下載的兩個文件。第一個包含數據,第二個文件包含MD5散列校驗和。Python中的Python MD5哈希比較3.2

我創建的從數據文件返回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") 

文件比較失敗,所以我打印出兩個:

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() 

我使用以下比較的文件fileHashfileHandleData,我得到以下內容:

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

從上面的輸出中,散列值是相同的。爲什麼散列比較失敗?我是新來的python和我使用python 3.2。有什麼建議麼?

謝謝。

+0

你沒有向我們展示你的函數,也沒有顯示你如何打印這些變量。顯然你顯示的值是不同的,但不是什麼類型的(一個是字節串的repr(),另一個是十六進制數據)。你可能想看看http://cfv.sourceforge.net/ – 2011-05-02 05:58:29

回答

1

比較失敗出於同樣的原因,這是錯誤的:

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

謝謝你的幫助。我使用了你的建議,並做了如下修改'如果fileHandleData.decode(「utf-8」)中包含fileHash:'。 – David 2011-05-02 11:00:50

0

哈希值是相同的,但字符串不是。您需要獲取摘要的十六進制值,並且需要將散列解析爲文件。一旦你完成了這些,你可以比較他們的平等。

+0

我從摘要中得到了十六進制值,你如何解析這個文件中的哈希值?你能舉一個例子嗎? – David 2011-05-02 06:03:09

+0

切片字符串結束。'>>>'12345 \ n'[ - 3:-1]' ''45'' – 2011-05-02 06:18:32

1

您正在比較散列值與fileHandle的內容。你需要擺脫MD5 (hashFile.tbz) =部分以及結尾的換行的,所以嘗試:

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

記住,在Python 3,rsplit()rstrip()不支持緩衝API,只對字符串進行操作。因此,正如Fred Nurk正確添加的那樣,您還需要對fileHandleData/fileHash(分別爲字節緩衝區或(Unicode)字符串)進行編碼/解碼。

+0

感謝您的建議。 – David 2011-05-02 11:02:25

0

試試 「fileHash.strip(」 \ n「)......然後比較這兩個這應該解決這個問題