2013-11-28 83 views
3

我試圖在使用md5sum linux命令和CryptoJS的MD5方法時獲取tar文件的md5sum以產生相同的值。通過Crypto.js獲取文件的md5sum

在JavaScript怎麼辦?(文件已經放在HTML表單後):

var reader = new FileReader(); 

reader.onloadend = function() { 
    text = (reader.result); 
} 

reader.readAsBinaryString(document.getElementById("firmware_firmware").files[0]); 

var hash = CryptoJS.MD5(text); 

hash.toString(); 

在Linux中我做的:

md5sum name_of_file.tar 

目前這兩個產生不同的結果。我怎樣才能讓JavaScript獲得tar文件內容的MD5ed,就像md5sum在Linux上做的一樣?

對於一個簡單的字符串,md5sum和CryptoJS產生相同的值。

編輯:使用名爲Fred.txt的文件,內容爲「Fred」,md5sum和CryptoJS都會生成相同的值:c624decb46fa3d60e824389311b252f6。

在update.tar文件,在Linux上的md5sum給我:1f046eedb7d8279953d233e590830e4f,在CryptoJS它給了我:f0c3730e5a9863cffa0ba3fadd531788

EDIT2:進一步的測試表明,這其實是一個問題,由於文件尺寸較大,如7 MegaBytes

+1

你能舉兩個例子嗎? 'readAsBinaryString(.....)'有可能散列文件名而不是文件內容? – DanFromGermany

+0

感謝您的回覆,我用簡單的字符串測試了一個簡單的txt文件,在這種情況下,linux和CryptoJS上的md5sum產生了相同的結果。我將在輸出中進行編輯。 – tblakey89

+0

我也遇到了CryptoJS.MD5()的這個問題,並且我發現了Paul Johnston的另一個功能,它給出了正確的md5。您可以在線測試http://plink.link/39cc83f38263adee5bc655f11fbcefab/html – moldcraft

回答

4

JavaScript中的所有字符串 - 甚至是「二進制字符串」 - 實際上都是UTF-16字符。 「二進制字符串」是選擇僅使用前256個編碼點的字符串。由於Latin-1編碼也正好使用前256個編碼點,所以可以使用Latin-1將字符串轉換爲字節。

var hash = CryptoJS.MD5(CryptoJS.enc.Latin1.parse(text)); 
0

我認爲這是因爲該文件沒有完成加載,並在文件上傳爲100%之前創建了散列。嘗試將散列移入onloadend事件:

var reader = new FileReader(); 

reader.onloadend = function() { 
    var hash = CryptoJS.MD5(reader.result); 
    hash.toString(); 
} 

reader.readAsBinaryString(document.getElementById("firmware_firmware").files[0]); 
+0

感謝您的回答,我試過了,但沒有奏效。我欣賞儘管。通過進一步的測試顯示,不同的結果僅在幾兆字節大小的文件中出現。所以也許順着正確的路線,因爲這是在我的本地機器上,並在客戶端完成,上傳真的可以成爲一個問題嗎? – tblakey89

+0

這可能也是由於限制'php.ini' - 'max_post_size'或'max_upload_size'或類似的東西。如果文件將被上傳100%,那麼哈希將與所有庫相同。 (如果你使用的是PHP) – DanFromGermany