2017-08-24 118 views
-3

我遍歷一個包含二進制文件的文件夾,並試圖計算每個文件的哈希值,特別是sha1和sha256。在我的跑步中,我奇怪地爲所有文件獲得相同的sha256值,但sha1值不同(因此是正確的)。不同的SHA1但相同的SHA256

下面是一個輸出文件的截圖,顯示sha1哈希是否正確完成。但sha256不是。 (每個二進制文件的文件名對不起也是它的SHA1)

wat is dis

有什麼錯我的過程嗎?這是Python中的相關代碼。我沒有看到某些東西。抱歉。

out.write("FILENAME,SHA1,SHA256\n") 
for root, dirs, files in os.walk(input_path): 
    for ffile in files: 
     myfile = os.path.join(root, ffile) 
     nice = os.path.join(os.getcwd(), myfile) 

     fo = open(nice, "rb") 
     a = hashlib.sha1(fo.read()) 
     b = hashlib.sha256(fo.read()) 
     paylname = os.path.basename(myfile) 
     mysha1 = str(a.hexdigest()) 
     mysha256 = str(b.hexdigest()) 
     fo.close() 

     out.write("{0},{1},{2}\n".format(paylname, mysha1, mysha256)) 
+2

您認爲'fo.read()'在讀取文件內容時會讀取什麼內容? – deceze

+3

當你爲sha1哈希執行'fo.read()'時,你已經讀取了整個文件,但是你永遠不會將光標移回到文件的開頭。所以sha256散列的輸入總是相同的(沒有) –

+1

'hashlib.sha256(b'').hexdigest()=='e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855'' –

回答

0

,因爲我把我的評論上面,你正在閱讀的第一哈希整個文件,但是你需要尋求迴文件開始讀它第二哈希第二次。或者你可以將它存儲在一個變量中,並將其傳遞給每個散列。

out.write("FILENAME,SHA1,SHA256\n") 
for root, dirs, files in os.walk(input_path): 
    for ffile in files: 
     myfile = os.path.join(root, ffile) 
     nice = os.path.join(os.getcwd(), myfile) 

     fo = open(nice, "rb") 
     a = hashlib.sha1(fo.read()) 
     fo.seek(0,0) # seek back to start of file 
     b = hashlib.sha256(fo.read()) 
     paylname = os.path.basename(myfile) 
     mysha1 = str(a.hexdigest()) 
     mysha256 = str(b.hexdigest()) 
     fo.close() 

     out.write("{0},{1},{2}\n".format(paylname, mysha1, mysha256)) 
相關問題