2015-09-22 96 views
0

我正在嘗試使用javascript來計算文件的SHA1值。 該文件位於與index.html相同的目錄中,並且使用ajax作爲查詢參數給出的名稱進行加載。SHA1計算返回錯誤值

例如,呼叫http://localhost:7070/index.html?file=file.zip應計算爲SHA1 file.zip

下面的代碼計算SHA1 但結果比我得到使用帶有SHA1這個在線工具和上傳文件http://onlinemd5.com/

不同
$(document).ready(function(){ 
    var file = utils.getUrlVars() && utils.getUrlVars().file; 

    if (!file) throw "error - no URL was found. set 'file' in query string."; 

    $.ajax({ 

     url: file, 
     success: function(data){ 
      var sha1= CryptoJS.SHA1(data).toString(); 
      console.log('sha1 - success', sha1); 
     }, 
     error: function(error){ 
      console.log('ERROR'); 
     } 

    }) 
}); 

有什麼區別?我想在線工具計算它是正確的(它也給了我使用Java代碼計算時得到的確切結果),所以這個JS代碼中的某些內容略微不同。

的問題絕對不是在CryptoJS包計算使用腳本字符串「你好」時,因爲會產生以下結果:

sha1 - success aaf4c61ddcc5e8a2dabede0f3b482cd9aea9434d 

,在使用在線工具,你會得到相同的(大寫):

AAF4C61DDCC5E8A2DABEDE0F3B482CD9AEA9434D 

問題是加載它後的數據格式或使用它的方式。

當我使用Java來計算SHA1時,我通過計算它在文件字節數組上得到了相同的結果,所以它指出了使用此腳本的bytearray在某種程度上不同/部分的事實。

+1

你得到什麼SHA1SUM文件?它是da39a3ee5e6b4b0d3255bfef95601890afd80709?那將是一個空文件。嘗試比較一個已知的簡單字符串的JavaScript輸出。 「你好」應該產生aaf4c61ddcc5e8a2dabede0f3b482cd9aea9434d。如果運行良好,錯誤在文件處理中。也許JavaScript不允許從磁盤加載文件。 – neuhaus

+0

不,結果在我更改文件時發生變化,它確實計算了與文件相關的SHA1。 – Eyal

+0

發送文件內容時,是否使用了頭文件「Content-Type:application/octet-stream」? – Mjh

回答

0

我們設法最終解決這個問題,解決的辦法是沒有Ajax的純JS涉及:

$(document).ready(function(){ 

var url = utils.getUrlVars() && utils.getUrlVars().url; 

if (!url) throw "error - no URL was found. set 'url' in query string."; 

var oReq = new XMLHttpRequest(); 
oReq.open("GET", url, true); 
oReq.responseType = "blob"; 

oReq.onreadystatechange = function(e) { 

    if (oReq.readyState == 4 && oReq.status == 200) { 
     console.log('xhr success'); 
     success(e); 
    } else if (oReq.readyState == 4 && oReq.status != 200){ 
     console.log('xhr error'); 
     error(e); 
    } 
} 

var success = function() { 
    var blob = oReq.response; 
    var sha1 = CryptoJS.algo.SHA1.create(); 
    var reader = new FileReader(); 
    reader.readAsArrayBuffer(blob); 

    reader.onload = function(e) { 
     var arrbuffer = e.target.result.slice(0, e.target.result.byteLength); 
     var bytes = CryptoJS.enc.u8array.parse(new Uint8Array(arrbuffer)); 
     sha1.update(bytes); 
     var sha1res = sha1.finalize().toString(CryptoJS.enc.Hex); 
     // print results 
     console.log('sha1 - success', sha1res); 
    } 
}; 

var error = function(){ 
    IJavaScriptImplementer.onError(JSON.stringify(error)); 
    IJavaScriptImplementer.log(JSON.stringify(error)); 
} 

oReq.send(null); 
}); 

正如你凸輪看到,該文件要求爲BLOB和被讀作一個片(可以也是一片一片地做,但在我的情況下文件很小),然後讀取字節並計算到SHA1值。

0

根據the manual for .ajax您需要將dataType選項設置爲text,否則它將嘗試猜測類型,然後text永遠不是一個選項。

+0

試圖添加以下內容,但結果相同:dataType:'text' – Eyal